如何在mongodb中查询嵌套文档?

如何在mongodb中查询嵌套文档?,mongodb,Mongodb,我有带嵌套文档的文档审阅: { "_id" : ObjectId("53a5753937c2f0ef6dcd9006"), "product" : "Super Duper-o-phonic", "price" : 11000000000, "reviews" : [ { "user" : "fred",

我有带嵌套文档的文档
审阅

{
        "_id" : ObjectId("53a5753937c2f0ef6dcd9006"),
        "product" : "Super Duper-o-phonic",
        "price" : 11000000000,
        "reviews" : [
                {
                        "user" : "fred",
                        "comment" : "Great!",
                        "rating" : 5
                },
                {
                        "user" : "Tom",
                        "comment" : "Great again!",
                        "rating" : 5
                },
                {
                        "user" : "Tom",
                        "comment" : "I agree with fred somewhat",
                        "rating" : 4
                }
        ]
}
我只想找到那些评分为5的
评论

最终查询应选择
产品
价格
评论
中的两个文档,其
评级
为5

我尝试的最后一个查询是:

db.testData.find({'reviews':{$elemMatch:{'rating':{$gte:5}}}}).pretty()
这很奇怪,但不起作用

如何在mongodb中执行此操作?

请查看此处:

以防你想到这个: 如果您尝试使用
$elemMatch
完成此操作,它将返回第一个匹配的审阅。

在这里查看:

以防你想到这个: 如果您尝试使用
$elemMatch
完成此操作,它将返回第一个匹配的审阅。

如果您只需要来自
审查
且其
评级
为5的单个子文档,则可以使用包含与您的查询匹配的
审查
的第一个元素:

db.test.find({'reviews.rating':5},{product:1,price:1,'reviews.$':1})
如果您希望所有
审查
元素的
评分
为5(而不仅仅是第一个),您可以使用
聚合
而不是
查找

db.test.aggregate([
//仅包括至少有一个5级评审的文档
{$match:{'reviews.rating':5},
//复制文档,每个审阅元素一个
{$unwind:'$reviews'},
//仅包括评级为5的项目
{$match:{'reviews.rating':5},
//在输出中仅包括以下字段
{$project:{产品:1,价格:1,评论:1}}}])
如果您只需要来自
审查
且其
评级
为5的单个子文档,则可以使用包含与您的查询匹配的
审查
的第一个元素:

db.test.find({'reviews.rating':5},{product:1,price:1,'reviews.$':1})
如果您希望所有
审查
元素的
评分
为5(而不仅仅是第一个),您可以使用
聚合
而不是
查找

db.test.aggregate([
//仅包括至少有一个5级评审的文档
{$match:{'reviews.rating':5},
//复制文档,每个审阅元素一个
{$unwind:'$reviews'},
//仅包括评级为5的项目
{$match:{'reviews.rating':5},
//在输出中仅包括以下字段
{$project:{产品:1,价格:1,评论:1}}}])

我刚试过这个,如果我从
评论中选择两个评级为5的文档,它就不起作用了。因为
审核。$
确保结果中只包含第一个匹配的文档。@volodymyrlevytsky如果您想包含所有评分为5的审核,而不仅仅是第一个审核,我会使用
聚合方法。我只是尝试了这个方法,如果我从评分为5的
审核中选择两个文档,它就不起作用了。因为
审核。$
确保结果中只包含第一个匹配的文档。@volodymyrlevytsky如果希望包含所有评分为5的审核,而不仅仅是第一个审核,我将使用
聚合方法。我尝试了$elemMatch,但它不起作用。你能发布一个查询吗?我尝试了$elemMatch,但它不起作用。你能发布一个查询吗?