我正在尝试创建一个 MongoDB 查询,在其中获取两个用户之间的对话。基本上我的对话对象如下所示:
{
"_id" : ObjectId("123"),
"from" : ObjectId("456"),
"to" : ObjectId("789"),
"content" : "Hi!",
"createdAt" : 1558037545568.0
}
我想按 createdAt
降序显示他们的对话,并将他们的用户对象放在一起。我知道我需要使用 $lookup
来搜索 users
查询,但我有一些问题:
- 如何创建一个
$lookup
操作来吸引两个用户? - 如何管理它,使用户
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
数组来“规范化”您的文档,该数组将包含按升序排序的 from
和 to
。然后在该数组上运行 $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/