Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MongoDB中更新重复文档?_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

如何在MongoDB中更新重复文档?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,当我发现重复项时,我在查找如何更新字段时遇到问题。 我需要做的是: 查找具有相同ipAddr、相同bccId和活动True的文档 如果它们有不同的sessionId字段,我需要将具有较旧lastUpdated的字段的活动字段更新为false 在这一点上,我试图得到所有的副本。 我找到了一些关于如何做到这一点的链接,但到目前为止没有一个适合我 这是一个我需要更新的项目的场景: db.mycollection.insert( [ { "_id" : 12

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

查找具有相同ipAddr、相同bccId和活动True的文档

如果它们有不同的sessionId字段,我需要将具有较旧lastUpdated的字段的活动字段更新为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

所以在找到这两个之后,我需要比较它们的更新时间。最近一次会议应保持活跃。所有其他的都应该更新,以便活动的现在为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
            }
        }
    }
])
使用聚合,它将返回一个游标。然后,我只需让光标遍历它,并在活动服务器上执行我需要的更新,其中bccId和ipAddr是相同的,并且它们不等于列表顶部的会话id(当我对更新时间进行排序时,第一个将是最新的,我希望保持活动状态)


就是这样:)

为什么你的id是一样的?对不起。只是打字错误。只是将_id更改为不同的。您可以稍微更改模式,以便通过在
{ipAddr:1,bccId:1}
上放置唯一索引来帮助您仅跟踪活动会话,这样,只有一个条目始终存在。要跟踪旧会话,您可以将它们保存在辅助集合的其他位置。这不起作用。。。客户不需要对结构进行任何更改,因此我们可以在那里更改任何内容:P