gpt4 book ai didi

javascript - MongoDB 聚合并匹配返回的键

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:07 26 4
gpt4 key购买 nike

问题是,我正在编写一些代码来从数据库获取用户消息。数据库有 sent_tosent_bymessage 键,我要获取数据键的命令是

db.users_messages.aggregate({$group: {_id: {to: "$sent_to", by: "$sent_by"}}})

这将返回所有 sent_tosent_by Users_ID 的列表。现在假设如果user1已将消息发送给user2并且user2也已回复user1,我希望它仅返回user1user2,而不是user2user1返回。当我稍后检查这个东西时,我剩下分页的事情,因为我在聚合上应用 $limit 。希望有人能帮忙!

最佳答案

您所要求的并不是一件小事,我认为真正的解决方案是在您的文档中包含更多元数据,特别是以一致的方式表示对话是在“谁之间”进行的。

我的意思是,对话的“ key ”必须是唯一的,无论谁发送消息或谁接收消息。考虑这两个基本文档。

{ "from": 1, "to": 2, "between": [1,2] },
{ "from": 2, "to": 1, "between": [1,2] }

在每种情况下,“from”和“to”都是每个“用户”的唯一标识符,并且始终以特定方式排序。 “之间”数据始终排序以保持相同的顺序,这可以在您创建时在代码中完成,或通过 $sort 的“upsert”功能来完成。修饰符和 $each ,但重点是保留“唯一”键,用于确定哪些文档属于同一分组。

可以单独使用聚合框架,但是当您认为可以在文档中维护它时,实际上没有必要跳圈:

db.converse.aggregate([
{ "$group": {
"_id": "$_id",
"from": { "$push": "$from" },
"to": { "$push": "$to" }
}},
{ "$project": {
"between": { "$setUnion": [ "$from", "$to" ] }
}},
{ "$unwind": "$between" },
{ "$sort": { "between": 1 } },
{ "$group": {
"_id": "$_id",
"between": { "$push": "$between" }
}},
{ "$group": {
"_id": "$between",
"count": { "$sum": 1 }
}}
])

在 MongoDB 2.6 之前的版本中,没有类似 **$setUnion 的内容可用,以不同的方式组合成数组:

db.converse.aggregate([
{ "$project": {
"from": 1,
"to": 1,
"type": { "$const": [ "from", "to" ] },
}},
{ "$unwind": "$type" },
{ "$group": {
"_id": "$_id",
"between": {
"$addToSet": {
"$cond": [
{ "$eq": [ "$type", "from" ] },
"$from",
"$to"
]
}
}
}},
{ "$unwind": "$between" },
{ "$sort": { "between": 1 } },
{ "$group": {
"_id": "$_id",
"between": { "$push": "$between" }
}},
{ "$group": {
"_id": "$between",
"count": { "$sum": 1 }
}}
])

在每种情况下,都表现出一定程度的偏执,即“未订购套件”。他们可能碰巧以这种方式出现,但你可能不能指望这一点。

这里的原理基本相同,通过在“Between”元素中创建一个唯一排序的“列表”,然后使用它作为分组键。从上面的示例文档中,忽略现有的 Between 字段,该过程将仅返回一个计数为“二”的文档,如下所示:

{ "_id" : [ 1, 2 ], "count" : 2 }

因此,在创建或修改文档时维护此类数据确实非常有意义。通过这种方式,分组变得简单,因为“唯一键”已经被识别

关于javascript - MongoDB 聚合并匹配返回的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25418611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com