我以这种方式设置架构:
{
_id:1234,
friends: [
{
"fid":1235
"is_user":true
},
{
"fid":1236
"is_user":true
},
{
"fid":1235
"is_user":false
}
]
}
我的要求是,在_id
的情况下,我需要找到(fid)
设置为true的所有朋友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
。有人可以帮我解决这个问题吗?
答案 0 :(得分:8)
在这种情况下,你不仅需要数组中的第一个匹配元素,你必须使用aggregation framework而不是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'}}
]);