MongoDB聚合多个对象

时间:2019-05-24 08:50:42

标签: mongodb aggregation-framework

我正在尝试创建一个MongoDB查询,以使两个用户之间进行对话。基本上,我的对话对象如下:

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

我想按createdAt降序排列他们的对话,并将他们的用户对象聚集在一起。我知道我需要在$lookup查询中使用users进行搜索,但是我有一些疑问:

  1. 如何创建一个$lookup操作来同时带动两个用户?
  2. 如何通过有时用户456from用户而有时是to用户的方式来管理它?与用户789相同。我没有得到太多。

这是当前查询,它使所有排序的内容都没有用户对象:

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

谢谢大家的帮助!

1 个答案:

答案 0 :(得分:2)

您可以通过添加newText数组来“规范化”文档,该数组将包含usersfrom升序排列。然后,在该数组上运行to(对参数排序)会更容易,

$match

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

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