mongodb - 在同一查询中过滤对象和子数组

时间:2016-06-22 12:19:37

标签: mongodb mongodb-query

我将以下数据结构保存在名为images

的mongodb集合中
[
    {
        folder: 'cats',
        files: [
            {filename: 'redCat.jpg', _id: 1},
            {filename: 'blueCat.jpg', _id: 2},
            {filename: 'yellowCat.jpg', _id: 3},
        ]
    },{
        folder: 'dogs',
        files: [
            {filename: 'redDog.jpg', _id: 4},
            {filename: 'blueDog.jpg', _id: 5},
            {filename: 'yellowDog.jpg', _id: 6},
        ]
    },{
       ...
    }
]

在给定文件夹和文件名的情况下,我需要提取特定图像的id。 我能够获取特定文件夹中的所有图像

db.images.find({folder:"cats"}, {files:1})

但我不知道如何过滤掉同一查询中的files数组,以获取blueCat.jpg图片ID。如果可能的话,我会避免两个连续的查询。

我尝试了以下查询

db.images.find({folder:"cats", "files.filename":"blueCat.jpg"})

但我得到的又是cats文件夹中的整个文件列表。我想要得到的是:

{filename: 'blueCat.jpg', _id: 2}

任何提示?提前致谢

2 个答案:

答案 0 :(得分:2)

试试这个 -

db.images.find({"folder":"cats","files.filename":"blueCat.jpg"}, {'files.$":1})

给你 -

{ "_id" : ObjectId("576a92b47f0d626b7a74c325"), "files" : { "filename" : "blueCat.jpg", "_id" : 2 } }

如果你想获取完整列表 -

db.images.find({"folder":"cats","files.filename":"blueCat.jpg"}, {'files":1})

会导致你 -

{ "_id" : ObjectId("576a92b47f0d626b7a74c325"),
 "files" :
 { "filename" : "blueCat.jpg", "_id" : 2 }
 {"filename" : "xxxCat.jpg", "_id" : N }
 {"filename" : "yyyCat.jpg", "_id" : N }
 }

答案 1 :(得分:0)

您可以使用聚合管道执行此操作,然后展开文件数组,然后查询(match)您要查找的文件名。

例如:

db.images.aggregate([{$unwind:"$files"},{$match:{"files.filename":"blueCat.jpg"}}])

会给你:

{ "_id" : ObjectId("576a92b47f0d626b7a74c325"), "folder" : "cats", "files" : { "filename" : "blueCat.jpg", "_id" : 2 } }

您可以使用project进一步优化输出文档。例如:

db.images.aggregate([{$unwind:"$files"},{$match:{"files.filename":"blueCat.jpg"}},{$project:{"files.filename":1, "files._id":1}}])

将返回:

{ "_id" : ObjectId("576a92b47f0d626b7a74c325"), "files" : { "filename" : "blueCat.jpg", "_id" : 2 } }