MongoDB查询子文档数组

3

在发布这个问题之前,我进行了彻底的研究,但是我没有找到一个准确的解决方案。我有以下结构:

stname: "SC",
dob : "1985",
education {[
            {name : Lancaster,
             year : 2013},

            {name : Manchester, 
             year : 2001, 
             grad : 2004},

            {name : Gambia, 
             year : 2001, 
             grad : 2011}
         ]}

我希望只返回具有grad字段的文档,因此最后两个文档应该被返回。

我尝试了以下查询但没有成功。

db.applicants.find({"education" : { $elemMatch : {"grad" : {$exists : true}}}}, {"name":1, "education.grad" : 1}).pretty()

只返回第一个匹配项,如下所示,第一个文档为空

{
    "_id" : ObjectId("574dd5fcbda73af19e361a3f"),
    "name" : "SC",
    "education" : [
        {

        },
        {
            "grad" : "2004"
        },
        {
            "grad" : "2011"
        }
    ]
}

此外,下面的查询将为您提供类似的结果,即在不存在 grad 字段的地方生成一个空文档。
db.applicants.find({"education.grad" : { $exists : true}}, {"education.grad" : {$exists : true}, "education.grad" : 1, name : 1 , dob : 1}).pretty()

我在这里回答了一个类似的问题:http://stackoverflow.com/questions/37510908/mongodb-search-by-datetime-type-not-working/37511250 - felipsmartins
@felipsmartins,我认为它们是非常不同的,他试图根据一个字段进行查询。 - fanbondi
哦,我明白了。恐怕你需要使用聚合。 - felipsmartins
@felipsmartins,请查看第一个查询的输出的编辑。空文档是主要问题。没有它,一切都会正常工作。 - fanbondi
可能是https://dev59.com/62865IYBdhLWcg3wHKpe的重复问题。单个元素和多个元素情况下的答案都可以在那里找到。 - JohnnyHK
@JohnnyHK,我整天都在这个帖子上,但我觉得它和我的问题不一样。你能否请发出你的有效查询? - fanbondi
1个回答

2
更新答案:
db.applicants.aggregate({$unwind: "$education"}, 
{$match: {"education.grad":{$exists: true}}}, 
{$project: {"education.name": 1, "education.grad": 1, "_id": 0}})

这将返回两个记录,没有空文档。


这将为您提供与我上面的查询相同的结果。在grad不可用的地方,您将获得一个空文档。 - fanbondi
@fanbondi 这太奇怪了。我尝试重新创建你的文档,并按照你的方式编写相同的查询,但我得到的结果与你发布的不一样。我觉得可能有些东西遗漏了。明确地说,无论是使用我的查询还是你的查询,我都没有得到空文档。 - Daniele Graziani
嗯,这很有趣。那么问题可能是什么呢?我正在使用Mongo 3.2.5版本。你用的是哪个版本?可以通过db.version()来获取结果。 - fanbondi
我输入了一个与你的不匹配的集合(问题开头提供的代码有一些格式问题)。请看我的新答案。希望这次能行!我正在使用3.2.4版本。 - Daniele Graziani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接