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

时间:2018-04-02 18:11:37

标签: mongodb mongodb-query aggregation-framework

我在找到重复内容时发现如何更新字段时遇到问题。 我需要做的是:

查找具有相同ipAddr,相同bccId且具有活动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,但具有不同的sessionIds。

所以在找到这两个之后,我需要比较他们的updateTime。最近的应该保持活跃。所有其他的都应该更新,因此活动现在将是假的。

对值进行硬编码,我可以找到重复列表,如下所示:

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

但是我无法弄清楚如何使用硬编码值来比较系统中的其他文档。 当我尝试使用组时,它没有用,因为可能有很多重复项,我需要通过相同的ipAddr和bccId组来获取它们。 此外,我不确定这是否是正确的方法来获取列表,然后比较日期以更新字段。

在搞清楚之后,我需要将它解析为Java,所以不确定我是否应该直接使用Java dev来创建查询。如果有人可以帮助我解决这个问题的最佳方法,那将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

所以这就是我的所作所为:

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相同的活动上执行我需要的更新,它们不等于列表顶部的会话ID(因为我对updateTime进行了排序,第一个将是最新的,我想保持活跃的。)

就是这样:))