1

スキーマを次のように設定します。

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

私の要件は、が与えられた場合、 trueに設定されている_idすべての友達ID(fid)を見つける必要があるということです。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 に答える