gpt4 book ai didi

mongodb - 如何更新 MongoDB 中的重复文档?

转载 作者:可可西里 更新时间:2023-11-01 10:46:53 25 4
gpt4 key购买 nike

当我发现重复项时,我在查找如何更新字段时遇到了问题。我需要做的是:

查找具有相同 ipAddr、相同 bcc​​Id 且具有 active True 的文档

如果他们有不同的 sessionId 字段,我需要将具有较早 lastUpdated 的字段的字段 active 更新为 false。

此时我正在尝试获取所有重复项。我找到了几个关于如何做到这一点的链接,但到目前为止,没有一个对我有用。

这是我需要更新的一个项目的场景:

db.mycollection.insert(
[
{
"_id" : 12345,
"bccId" : "1",
"ipAddr" : "1",
"sessionId" : "1",
"updateTime" : ISODate("2010-02-11T01:05:35Z"),
"active" : true,

},

{
"_id" : 12346,
"bccId" : "1",
"ipAddr" : "1",
"sessionId" : "2",
"updateTime" : ISODate("2016-02-11T01:05:35Z"),
"active" : true,

},
]
)

它们都具有相同的 bccId、ipAddr 和 active true,但具有不同的 sessionId。

所以在找到这两个之后,我需要比较它们的更新时间。最近的应该保持活跃。所有其他的都应该更新,这样 active 现在就变成了 false。

对值进行硬编码,我可以找到这样的重复项列表:

db.mycollection.aggregate([{ $match: { ipAddr: "1", bccId: "1", active: true } }])

但我想不出如何不使用硬编码值,而是在系统中的其他文档之间进行比较。当我尝试使用组时它不起作用,因为可能有很多重复项,我需要按我相信的相同 ipAddr 和 bccId 的组来获取它们。此外,我不确定这是否是获取列表然后比较日期以更新字段的正确方法。

弄清楚后,我需要将其解析为 Java,因此不确定是否应该直接转至 Java 开发人员来创建查询。如果有人可以帮助我找出解决此问题的最佳方法,我将不胜感激。

谢谢!

最佳答案

所以这是我所做的:

db.mycollection.aggregate([
{
"$match":
{
"active": true
}
},
{
"$sort":
{
"updateTime": -1

}
},
{
"$group":
{
"_id":
{
"ipAddr": "$ipAddr",
"bccId": "$bccId"
},
"session":
{
"$push": {
"sessionId": "$sessionId",
"updateTime": "$updateTime"
}
},
"sessionCount":
{
"$sum": 1
}
}
}
])

使用聚合,它会返回一个 Cursor。然后我只是让光标遍历它并在 bccId 和 ipAddr 相同的事件上执行我需要的更新,它们不等于列表顶部的 session ID(因为我对 updateTime 进行了排序,第一个将是最新的,我想保持活跃)。

就是这样:)

关于mongodb - 如何更新 MongoDB 中的重复文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49616440/

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