2015-01-25 9 views
1

최근에 내 서버에 버그가 발생했으며 조사가 끝난 후 MongoDB 사전은 BSON 구조로 인해 주문되었습니다._id 및 다른 필드에서 MongoDB 필드 정렬 동작이 다른가요?

내가 이해할 줄 알았는데, 이해할 수없는 테스트가있다. (mongo 2.6.4) : 그 필드는 _id에 대해서만 문제가 되는가?

시험 1 : 삽입 {A : 1, B 2} 및 룩업 {B : (2), 1} - : 삽입 {smthg>

> db.d.insert({a: 1, b: 2}) 
> db.d.find() 
{ "_id" : ObjectId("54c4dfd17e8b0ba11cf1539d"), "a" : 1, "b" : 2 } 
> db.d.find({b: 2, a: 1}) 
{ "_id" : ObjectId("54c4dfd17e8b0ba11cf1539d"), "a" : 1, "b" : 2 } 

시험 2 FOUND {A : 1, B : 2}} 및 조회 {smthg : {B : 2, A : 1}} -> 설명에 대한

> db.d.insert({smthg: {a: 1, b: 2}}) 
> db.d.find({smthg: {b: 2, a: 1}}) 
> db.d.find({smthg: {a: 1, b: 2}}) 
{ "smthg" : { "a" : 1, "b" : 2 } } 

덕분에

+0

내가 물어 봐도 될까요? – joao

+0

@joao 키로 사용합니다. 예를 들면 : _id : {first_name, last_name} 그리고 나는 그것을 조사 할 수 있습니다. 다른 이유 : mapreduce의 열쇠는이 형태로 제공됩니다. – Thomas

+0

문서 _id는 합당한 이유가없는 한 모든 문서가 가지고 있으며 혼동해서는 안되는 특별한 고유 한 필드입니다. 첫 번째 예에서 보여준 것처럼 필드를 추가하여 문제를 해결할 수 있습니다. 또한, map-reduce의 결과 _id는 원본 문서 _id와 아무 관련이 없으므로 여기에서 논리를 수행 할 필요가 없습니다. – joao

답변

2

나는이에 직접 docs을 인용 수 있습니다 찾을 수 없습니다

하위 문서가 필드 순서를 포함하여 지정된 하위 문서와 정확히 일치하는 경우 하위 문서 내에서 일치 검색을 통해 문서를 선택합니다.

그 목적

, 당신은 더 나은 것 사용 봉사 dot notation : 당신이 _id 필드에 임베디드 객체를 저장할 이유

db.d.find({"smthg.a" : 1, "smthg.b" : 2}); 
+1

경우에만 추가 ** 설명 된 것과 같이 단수의 "하위 문서"의 "하위 문서"가 배열의 멤버 인 곳에 올바른 표기법은'{ "smthng": { "$ elemMatch": { "a": 1, "b": 2}}}'입니다. 그러나 실제 "배열"에 대해서만 그렇게 할 수 있습니다. 이 구조체에 대해 수행하면 배열이 아니기 때문에 실패합니다. –