我将以下数据结构保存在名为images
[
{
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}
任何提示?提前致谢
答案 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 } }