MongoDB聚合查询,以查找至少包含来自另一个集合的一个匹配项的对象

时间:2018-10-06 20:14:20

标签: mongodb mongodb-query

我正在尝试为我的电影mongo数据库编写一个查询,该数据库具有两个集合,电影和评分,其结构如下: 电影

{
    "_id" : ObjectId("5bb3e0a9dac8ab419c430e94"),
    "MovieId" : 3,
    "MovieTitle" : "Four Rooms (1995)",
    // and other unrelated fields
}

评分:

{
    "_id" : ObjectId("5bb3e049dac8ab419c4223ed"),
    "user_id" : 450,
    "item_id" : 172,
    "rating" : 4,
    "timestamp" : 882372103
}

其中MovieId == item_id。 我需要找到所有电影的前十名电影标题,其中至少一项评论评分低于3。

这是我尝试查找可以正常播放的前十部电影的ID:

db.ratings.aggregate(
  [
    {"$group":
      {
        _id: {item_id:"$item_id"},
        ratingAverage: {$avg: "$rating"}
      }
    } ,{$sort : { ratingAverage: -1 } }, {$limit : 10}
  ]
)

这是我的尝试,以查找评分至少低于3的前十部电影。

db.ratings.aggregate([
  {"$match":
    "rating":{"$lt":3}
  },
  {"$group":
    {
      _id: "$item_id",
      ratingAverage: {$avg: "$rating"}
    }
  },
  {$lookup:
  {
    "from": "movie",
    "localField": "_id",
    "foreignField": "MovieId",
    "as": "movie_details"
  }},{$sort : { ratingAverage: -1 } }, {$limit : 10}

])

此返回:

ok" : 0,
    "errmsg" : "The field 'rating' must be an accumulator object",
    "code" : 40234,
    "codeName" : "Location40234"

有人可以给我一些建议吗

1 个答案:

答案 0 :(得分:1)

您应该这样更改$match部分:

...
{"$match":
    { "rating":{"$lt":3} }
},
...

您可能忘了在查询{}的地方加上$match