MongoDb访问具有特定属性的对象数组

HVT*_*VT7 4 mongodb mongodb-query aggregation-framework

我有一份文件如下:

{
    user: 'hvt07',
    photos: [
    {
        link: 'http://link.to.com/image1.jpg',
        isPrivate: true
    },
    {
        link: 'http://link.to.com/image2.jpg',
        isPrivate: false
    }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想得到所有照片:

isPrivate: false
Run Code Online (Sandbox Code Playgroud)

我使用以下查询:

db.collection_name.find({ photos:{ $elemMatch:{isPrivate: false} } }).pretty()
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

db.collection_name.find({'photos.isPrivate': true}).pretty()
Run Code Online (Sandbox Code Playgroud)

但是两者都返回数组中的所有元素,即使是那些设置为:

isPrivate: true
Run Code Online (Sandbox Code Playgroud)

请建议.

sty*_*ane 5

聚合是解决方案.

您需要photos使用$unwind运算符解构数组 .接下来使用$match选择文件在哪里isPrivate: false.该$group您可以通过重新组合您的文件_id和重建您photos使用数组$push运算符

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 }}
     ]
)
Run Code Online (Sandbox Code Playgroud)