当我发现重复时,我在寻找如何更新字段时遇到问题。我需要做的是:
查找具有相同ipAddr、相同bccId且具有活动True的文档
如果他们有不同的session sionId字段,我需要更新字段active为false,用于旧的lastUpdate。
在这一点上,我试图得到所有的副本。我找到了几个关于如何做到这一点的链接,但是到目前为止没有一个对我有用。
这是我需要更新的一个项目的场景:
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,但具有不同的session sionID。
所以在找到这两个之后,我需要比较它们的updateTime。最近的应该保持活动状态。所有其他的都应该更新,这样活动现在就是假的。
对值进行硬编码,我可以像这样找到重复项列表:
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
}
}
}
])
使用聚合它将返回我一个光标。然后我只需让光标遍历它并对活动执行我需要的更新,其中bccId和ipAddr是相同的,并且它们不等于列表顶部的会话id(当我对updateTime进行排序时,第一个将是最近的,我想保持活动状态)。
就是这样:)