我有一份文件如下:
{
user: 'hvt07',
photos: [
{
link: 'http://link.to.com/image1.jpg',
isPrivate: true
},
{
link: 'http://link.to.com/image2.jpg',
isPrivate: false
}
]
}
我希望获得以下所有照片:
isPrivate: false
我使用以下查询:
db.collection_name.find({ photos:{ $elemMatch:{isPrivate: false} } }).pretty()
我也尝试过:
db.collection_name.find({'photos.isPrivate': true}).pretty()
但两者都返回数组中的所有元素,即使是那些设置为:
的元素isPrivate: true
请建议。
答案 0 :(得分:5)
Aggregation是解决方案。
您需要使用$unwind
运算符解构photos
数组。接下来使用$match
选择isPrivate: false
的文档。 $group
您可以_id
重新组合文档,并使用$push
运算符重建photos
数组
db.collection_name.aggregate(
[
{$unwind: "$photos"},
{$match: {"photos.isPrivate": false}},
{$group: {"_id": {"id": "$_id", "user": "$user"}, photos: {$push: "$photos"}}}
{$project: {"_id": "$_id.id", "user": "$_id.user", "photos": 1, "_id": 0 }}
]
)
答案 1 :(得分:0)
您可以将$ elemMatch用于结果投影,如下所示
db.collection_name.find(
{ photos:{ $elemMatch:{isPrivate: false} } }, //1
{photos:{$elemMatch:{isPrivate: false}}}) //2