我试图在名为programme
的数组中找到所有元素。运行db.base.find({"programme.title":"News"},{"programme.$.title":"News"}).pretty()
的结果是:
{
"_id" : ObjectId("55a48dd3e72db9d63e53478b"),
"programme" : [
{
"attributes" : {
"start" : "20150713010000 -0400",
"stop" : "20150713013000 -0400",
"channel" : "I47176.labs.zap2it.com"
},
"title" : "News",
"category" : "News",
"episode-num" : "SH01831861.0000",
"new" : true
}
]
}
但是有许多更多的条目称为"新闻"而不仅仅是一个,如上所示。
我也试过了db.base.find({"programme.title":"News"}).pretty()
,但这只会导致列出一堆随机条目,无论它们是否具有"新闻"的标题。
非常感谢你的帮助,以及对noob问题的强制性道歉"。
答案 0 :(得分:1)
您可以在聚合的帮助下实现如下:
db.base.aggregate([
{$unwind : "$programme"},
{$match : { "programme.title" : "News" } },
{$group : { "_id" : "$_id" , "programme" : { $push: "$programme" } } }
]);
答案 1 :(得分:0)
在MongoDB .find()
查询中投放匹配项只能返回符合条件的“第一个”元素。
为了获得“多个”匹配,您最好的方法是使用.aggregate()
和$redact
,首先使用$match
过滤文档:
db.base.aggregate([
{ "$match": { "programme.title":"News" } },
{ "$redact": {
"$cond": {
"if": { "$eq": [ { "$ifNull": [ "$title", "News" ] }, "News" } ],
"then": "$$DESCEND",
"else": "$$PRUNE"
}}
}}
])
这“删除”(“编辑”)数组中与您给出的“标题”不匹配的任何条目。
这是一种很好的方法,因为您不是使用$unwind
在管道中创建更多文档,这是使用数组的另一种方法。
问题在于,您的文档中不能有另一个具有相同属性名称“title”的元素,因为$$DECEND
会走进结构并比较每个级别的字段名称。