1

我的架构设置是这样的:

{
 _id:1234,
 friends: [
           {
             "fid":1235
             "is_user":true
           },
           {
             "fid":1236
             "is_user":true
           },
           {
             "fid":1235
             "is_user":false
           }
          ]
 }

我的要求是,给定 a _id,我需要找到所有设置为 true 的朋友(fid)ID is_user

我尝试了以下方法:

db.users.find({ friends: { $elemMatch : { is_app_user: true}}});

似乎在整个集合中给我返回结果,但我想要它作为一个 ID。所以我尝试了这个:

db.users.find({_id:1234},{friends: { $elemMatch : { is_app_user: true}}});

但这什么也没给我。另外,我只需要返回fid. 有人可以帮我解决这个问题吗?

4

1 回答 1

8

在这种情况下,您需要的不仅仅是数组中的第一个匹配元素,您必须使用聚合框架而不是find.

db.users.aggregate([
    // Find the matching document
    { $match: { _id: 1234 }},
    // Duplicate the document for each element of friends
    { $unwind: '$friends' },
    // Filter the documents to just those where friends.is_user = true
    { $match: { 'friends.is_user': true }},
    // Only include fid in the results
    { $project: { _id: 0, fid: '$friends.fid'}}
]);
于 2012-11-26T04:25:36.230 回答