2014-01-06 79 views
1
{ 
_id: ObjectId("52ca2d45b80de42808000001"), 
id: "1111139048239", 
name: "Bruce Lim", 
first_name: "Bruce", 
last_name: "Lim", 
friends: [ 
    { 
     id: "1913681", 
     name: "John Sim", 
     icon: "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash2/1117702_1913681_1171369396_q.jpg", 
     photos: [ 
      { 
       src: "https://scontent-a.xx.fbcdn.net/hphotos-ash2/t1/230718_10150181312510976_7606555_n.jpg", 
       lat: "38.2289", 
       lng: "-85.7495" 
      }, 
      { 
       src: "https://scontent-b.xx.fbcdn.net/hphotos-frc3/230480_10150181312620976_3864544_n.jpg", 
       lat: "38.2289", 
       lng: "-85.7495" 
      } 
     ] 
    }, 
    { 
     id: "31925743892", 
     name: "Mike Holloway", 
     icon: "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/211634_31925743892_1471358831_q.jpg", 
     photos: [ 
      { 
       src: "https://scontent-a.xx.fbcdn.net/hphotos-ash2/t1/230718_10150181312510976_7606555_n.jpg", 
       lat: "38.2289", 
       lng: "-85.7495" 
      }, 
      { 
       src: "https://scontent-b.xx.fbcdn.net/hphotos-frc3/230480_10150181312620976_3864544_n.jpg", 
       lat: "38.2289", 
       lng: "-85.7495" 
      } 
     ] 
    }, 
    { 
     id: "1954048", 
     name: "Christiana Basset", 
     icon: "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/211634_1954048_1471358831_q.jpg", 
     photos: [ 
      { 
       src: "https://scontent-a.xx.fbcdn.net/hphotos-ash2/t1/230718_10150181312510976_7606555_n.jpg", 
       lat: "38.2289", 
       lng: "-85.7495" 
      }, 
      { 
       src: "https://scontent-b.xx.fbcdn.net/hphotos-frc3/230480_10150181312620976_3864544_n.jpg", 
       lat: "38.2289", 
       lng: "-85.7495" 
      } 
     ] 
    } 
] 

文档}MongoDB的查询从

选择多个子集,当我查询这些文档这个集合与

db.mapping.find(
    {"id":"1111139048239"}, 
    {"friends":{ 
     $elemMatch:{"id":"1913681"} 
    }} 
) 

我得到一个匹配friend子回来了。

{ 
     "_id" : ObjectId("52ca2d45b80de42808000001"), 
     "friends" : [ 
       { 
         "id" : "1913681", 
         "name" : "John Sim", 
         "icon" : "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash2/1117702_1913681_1171369396_q.jpg", 
         "photos" : [ 
           { 
             "src" : "https://scontent-a.xx.fbcdn.net/hphotos-ash2/t1/230718_10150181312510976_7606555_n.jpg", 
             "lat" : "38.2289", 
             "lng" : "-85.7495" 
           }, 
           { 
             "src" : "https://scontent-b.xx.fbcdn.net/hphotos-frc3/230480_10150181312620976_3864544_n.jpg", 
             "lat" : "38.2289", 
             "lng" : "-85.7495" 
           } 
         ] 
       } 
     ] 
} 

如何选择多个子集。

db.mapping.find(
    {"id":"1111139048239"}, 
    {"friends":{ 
     $elemMatch:{"id":"1913681", "id":"1954048"} 
    }} 
) 

db.mapping.find(
    {"id":"1111139048239"}, 
    {"friends":{ 
     $elemMatch:{"id":"1913681"}, 
     $elemMatch:{"id":"1954048"} 
    }} 
) 

只得到最后一场比赛,在这种情况下是1954048。我如何得到两个 - 1913681,1954048?

+0

'$ elemMatch'只返回第一匹配元件在阵列中。要匹配多个元素,您必须使用聚合框架。有关此示例,请参阅:[只提取数组中的选定元素](http://stackoverflow.com/questions/3985214/mongodb-extract-only-the-selected-item-in-array/12241733#12241733)。 – Stennie

回答

2

发现MongoDB中的一般语法是

db.collection.find(<criteria>,<projection>) 

在你的情况,

criteria: id should be "1111139048239" 
projection: listing friends who have id 1913681, 1954048 

elemMatch只能得到该元素的第一存在,也当给出了相同属性的多个值它将只显示文档中最后执行的elemMatch。

我建议你去聚合。它会帮助你获得所需的输出。

db.mapping.aggregate([ 
      {$match:{id:"1111139048239"}}, // STEP 1 
      {$unwind:"$friends"}, // STEP 2 
      {$match:{"friends.id":{$in:["1913681","1954048"]}}} // STEP 3 
        ]) 

执行:

STEP 1: Selects the document with id "1111139048239" 
STEP 2: Unwinds the friends array in the selected document and 
     create multiple documents as per the size of friends array. 
     In this case 3 documents. 
STEP 3: Select documents which has a friends id "1913681", "1954048". 
     In this case 2 documents will be selected. Append values to array to get 
     more documents as output 
     {"friends.id":{$in:["1913681","1954048",etc]} 
+0

我沿着这条线尝试了一些东西,并且之前收到了整个文档。感谢您详细解释有关放松步骤的步骤。 –