我有一个像这样结构的“书籍”集合:
{
"isbn" : 101,
"title" : "One",
"author" : "Mike",
"year" : 1980,
"awards" : [
{"award" : "Nebula", "year" : 1987},
{"award" : "Hugo", "year" : 1985},
],
"reviews" : [
{"user_id" : 1, "rating" : 10, "text" : "Awesome book"},
{"user_id" : 2, "rating" : 4, "text" : "Terrible book"},
{"user_id" : 5, "rating" : 7, "text" : "Good book"},
]
}
我想只选择评论对象(而非整个文档),例如,评分高于5,以便我的结果如下:
"reviews" : [
{"user_id" : 1, "rating" : 10, "text" : "Awesome book"},
{"user_id" : 5, "rating" : 7, "text" : "Good book"},
]
如何编写db.books.find()查询来执行此操作?
答案 0 :(得分:1)
基本上,正如Sammaye所提到的,您需要使用聚合框架。目前我的机器上没有mongo,所以我无法验证我的查询是否有效,但我认为这样的事情必须要做的工作:
db.books.aggregate(
{ $unwind : "$reviews" },
{ $match : {
"reviews.rating": {$gt : 5}
}})
为了使其更完整,您可以使用$elemMatch,但它只返回第一个结果(这不是您需要的,但可能是其他人需要的)