MongoDB - 如何查找数组中的所有对象?

时间:2015-07-14 04:36:51

标签: mongodb mongodb-query

我试图在名为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问题的强制性道歉"。

2 个答案:

答案 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会走进结构并比较每个级别的字段名称。

相关问题