【问题标题】:MongoDB aggregate query to find Objects containing at least one match from another collectionMongoDB 聚合查询以查找包含来自另一个集合的至少一个匹配项的对象
【发布时间】:2018-10-07 04:40:17
【问题描述】:

我正在尝试为我的电影 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 的前 10 部电影片名。

这是我试图找到前 10 部电影的 ID:

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

这是我尝试找出评分至少低于 3 的前 10 部电影。

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"

有人可以给我一些关于如何解决这个问题的建议

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

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

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

    您可能忘记在$match 的查询周围加上{}

    【讨论】:

    • 谢谢!它只是摆脱了语法问题。但是,我未能从该查询中获得前 10 部电影。你有什么建议吗?
    • @K.U 删除第一个$match 部分,取而代之的是,获取所有movie_rating 小于3 的电影的item_id 列表,然后使用$filter 过滤所有电影都在这个列表中,那么你可以在这个过滤的评分列表中获得评分平均值,并获得前十名。
    • 很抱歉,我无法为您编写示例聚合查询,因为我必须生成一个假数据集才能自己测试查询,但如果您尝试过但不能自己完成此操作,您可以在某处上传 mongodump 并在此处放置链接,以便我可以根据该数据编写查询。
    猜你喜欢
    • 2022-01-18
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2023-02-01
    • 2018-05-03
    相关资源
    最近更新 更多