【问题标题】:mongoDB array document searchmongoDB数组文档搜索
【发布时间】:2015-03-25 09:38:08
【问题描述】:

这是一个很简单的问题,我搜索了所有,但没有找到答案

我只有

 {
"_id" : 1,
    "name" : {
        "first" : "John",
        "last" : "Backus"
    },
 "awards" : [
        {
            "award" : "W.W. McDowell Award",
            **"year" : 1967,**
            "by" : "IEEE Computer Society"
        },
        {
            "award" : "Draper Prize",
            **"year" : 1967,**
            "by" : "National Academy of Engineering"
        },
        {
            "award" : "National Medal of Science",
            "year" : 1975,
            "by" : "National Science Foundation"
        }
    ]
},
 {
 "_id" : 2,
    "name" : {
        "first" : "John",
        "last" : "McCarthy"
    },
"awards" : [
        {
            "award" : "Turing Award",
            "year" : 1971,
            "by" : "ACM"
        },
        {
            "award" : "Kyoto Prize",
            **"year" : 1967,**
            "by" : "Inamori Foundation"
        },
        {
            "award" : "National Medal of Science",
            "year" : 1990,
            "by" : "National Science Foundation"
        }
    ]
},

我只需要 1967 年获得的所有奖项!

我试过db.bios.find({"awards.year":1967},{award.$}).pretty()

我只得到

"_id" : 1,
"awards" : [
        {
            "award" : "W.W. McDowell Award",
            "year" : 1967,
            "by" : "IEEE Computer Society"
        },

],

但我需要在所有文件中找到(第一个文件有两个,所以总共有 3 个

{
"_id" : 1,
    "awards" : [
            {
                "award" : "W.W. McDowell Award",
                "year" : 1967,
                "by" : "IEEE Computer Society"
            },
             {
                "award" : "Draper Prize",
                **"year" : 1967,**
                "by" : "National Academy of Engineering"
            }
    ]
},
{
    "_id" : 2,
    "award":[{
                "award" : "Kyoto Prize",
                "year" : 1967,
                "by" : "Inamori Foundation"
            }
    ]
}

我尝试使用$all,但无法获得结果。我希望我清楚 是的,我使用的是 bios 示例。 这一定很简单,我有点短 请帮忙。

【问题讨论】:

标签: mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

您必须使用aggregation framework,因为$ 仅指第一个匹配项。在您的情况下,以下方法可能有效:

db.bios.aggregate( [ 
    { $match : {"awards.year":1967} }, 
    { $unwind : "$awards"}, 
    { $match : {"awards.year" :1967} } 
]);

产量

{
        "_id" : 1,
        "name" : {
                "first" : "John",
                "last" : "Backus"
        },
        "awards" : {
                "award" : "W.W. McDowell Award",
                "year" : 1967,
                "by" : "IEEE Computer Society"
        }
}
{
        "_id" : 1,
        "name" : {
                "first" : "John",
                "last" : "Backus"
        },
        "awards" : {
                "award" : "Draper Prize",
                "year" : 1967,
                "by" : "National Academy of Engineering"
        }
}
{
        "_id" : 2,
        "name" : {
                "first" : "John",
                "last" : "McCarthy"
        },
        "awards" : {
                "award" : "Kyoto Prize",
                "year" : 1967,
                "by" : "Inamori Foundation"
        }
}

如您所见,这将复制文档的其余部分(因此 John Backus 的文档被返回两次),但您可以通过添加 $group 来更改它,例如

db.bios.aggregate( [ { $match : {"awards.year":1967} },     
  { $unwind : "$awards"},      
  { $match : {"awards.year" :1967} }, 
  { $group : { _id : "$_id", "awards" : { $push : "$awards" } } } 
]).pretty();

但是有很多方法可以做到这一点,所以我建议您深入研究文档以获得所需的投影。

【讨论】:

  • 非常感谢!我需要彻底完成聚合。
  • 谢谢 我现在可以通过添加 $project 和 $sort 找到确切的。找到确切的元素后,有没有办法更新它?我的意思是如果我想在 name.first=john 的奖励数组中添加一个新项目?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2020-09-06
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
相关资源
最近更新 更多