MongoDB 聚合多个对象

标签 mongodb aggregation-framework

我正在尝试创建一个 MongoDB 查询,在其中获取两个用户之间的对话。基本上我的对话对象如下所示:

{
    "_id" : ObjectId("123"),
    "from" : ObjectId("456"),
    "to" : ObjectId("789"),
    "content" : "Hi!",
    "createdAt" : 1558037545568.0
}

我想按 createdAt 降序显示他们的对话,并将他们的用户对象放在一起。我知道我需要使用 $lookup 来搜索 users 查询,但我有一些问题:

  1. 如何创建一个 $lookup 操作来吸引两个用户?
  2. 如何管理它,使用户456有时是from用户,有时是to用户?对于用户 789 也是如此。我没太明白。

这是当前的查询,它带来了没有用户对象的所有有序内容:

db.getCollection('messages').aggregate([{
    $match: {
      $or: [
        { from: ObjectId("456") },
        { to: ObjectId("789") },
        { from: ObjectId("789") },
        { to: ObjectId("456") }
      ]
    }
  }, {
    $sort: { createdAt: -1 }
  }])

谢谢大家的帮助!

最佳答案

您可以通过添加 users 数组来“规范化”您的文档,该数组将包含按升序排序的 fromto。然后在该数组上运行 $match 会更容易(对参数进行排序),

db.collection.aggregate([
    {
    $addFields: {
        users: [ { $min: [ "$from", "$to" ] }, { $max: [ "$from", "$to" ] } ]
    } 
    },
    {
        $match: { users: [ "456", "789" ] }
    }
])

$lookup 可以直接在数组上运行,因此下一步应该使用以下语法:

{
    $lookup: {
        from: "users",
        localField: "users",
        foreignField: "_id",
        as: "users"
    }
}

关于MongoDB 聚合多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56289030/

相关文章:

javascript - 在 Mongoose 中对嵌套子文档进行排序和分组

c# - 使用 C# 从 MongoDB 中的文档中删除元素

mongodb - 如何使用 golang 和官方 mongo 驱动程序检查记录是否存在

mongodb - 在 MongoDB 中按一天中的时间查询日期时间

mongodb - 在 mongodb 投影中组合 $elemMatch 和 $

如果值等于某个值,MongoDB 就会排序

javascript - Mongodb 查询 ObjectID 返回 null

json - mongoexport JSON 断言 : 10340 Failure parsing JSON string

c# - MongoDB $first 不支持的错误 C# 驱动程序

mongodb - Mongo 中的两列分组