2012-06-04 3 views
54

나는 다음과 같습니다 일부 데이터가 :MongoDB - 컬렉션 내부에서 중첩 된 항목을 쿼리하는 방법?

[ 
    { 
     "_id" : ObjectId("4e2f2af16f1e7e4c2000000a"), 
     "advertisers" : [ 
      { 
       "created_at" : ISODate("2011-07-26T21:02:19Z"), 
       "category" : "Infinity Pro Spin Air Brush", 
       "updated_at" : ISODate("2011-07-26T21:02:19Z"), 
       "lowered_name" : "conair", 
       "twitter_name" : "", 
       "facebook_page_url" : "", 
       "website_url" : "", 
       "user_ids" : [ ], 
       "blog_url" : "", 
      }, 

을하고이 같은 쿼리가 광고주의 ID를 줄 것이라고 생각했다 :

var start = new Date(2011, 1, 1); 
> var end = new Date(2011, 12, 12); 
> db.agencies.find({ "created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , advertisers { name : 1 } }).limit(1).toArray(); 

하지만 내 쿼리가 작동하지 않았다. 어떤 아이디어를 어떻게 중첩 된 요소 내부의 필드를 내 필드 목록에 추가 할 수 있습니까?

감사합니다.

답변

92

를 사용하여 점 표기법 (예 : advertisers.name)를 쿼리하고 중첩 된 객체에서 필드를 검색 :

db.agencies.find({ "advertisers.created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , "advertisers.name": 1 } }).limit(1).toArray(); 

참조가 : Retrieving a Subset of FieldsDot Notation

+0

모든 것이 데이터에 있습니다. 나는. 조건이 잘못되었습니다 – AD7six

+8

'limit (1)'로'find'보다는'findOne'을 사용해야합니다. .ppt()? – EmmaGamma

3
db.agencies.find( 
{ "advertisers.created_at" : {$gte : start , $lt : end} } , 
{ program_ids : 1 , advertisers.name : 1 } 
).limit(1).pretty(); 
+1

그게 맞습니까? –

+0

그것은 .pretty()가 아닌 .pretty()입니다. –

+2

.findOne()은 .limit (1)보다 관용적입니까? – Ben

1

점 표기법이라는 한 가지 MongoDB를이 제공됩니다 요소의 배열을 볼 수 있습니다. 이를 사용하려면 입력하려는 각 배열에 점을 추가하는 것만 큼 간단합니다.

"_id" : ObjectId("4e2f2af16f1e7e4c2000000a"), 
    "advertisers" : [ 
     { 
      "created_at" : ISODate("2011-07-26T21:02:19Z"), 
      "category" : "Infinity Pro Spin Air Brush", 
      "updated_at" : ISODate("2011-07-26T21:02:19Z"), 
      "lowered_name" : "conair", 
      "twitter_name" : "", 
      "facebook_page_url" : "", 
      "website_url" : "", 
      "user_ids" : [ ], 
      "blog_url" : "", 
     }, 
     { ... } 

당신이 그들 각자 내부의 속성 created_at을 찾기 위해 광고주의 배열 내부에 가고 싶은 경우 경우

는 단순히 재산 { '광고주와 쿼리를 작성할 수 있습니다. created_at ': query} like 다음과 같습니다.

db.agencies.find({ 'advertisers.created_at' : { {$gte : start , $lt : end} ... } 
+0

당신이 받아 들인 답안을 복사했으나 잘못 복사 한 것뿐만 아니라, 물리적 인 오류를 고치더라도'광고주 {name : true}'는 valiud 구문이 아닙니다. MongoDB는 그런 방식으로 영사 문서를 읽지 않습니다 – Sammaye

관련 문제