如何使用java驱动程序在mongoDB中查找文档并更新其列表?

时间:2013-12-16 11:53:06

标签: java mongodb

我希望通过一个列表中的对象中的某些值查找文档,并更新列表对象值。 虽然它通过列表值找到文档并减去topups.total.cnt和topups.total.revenue的值(如果它没有那么它们将是3和36000000),它不会将false更改为true,除非对于第一个对象 在列表中。 我想这一行

"updateObj.append("$set", new BasicDBObject("topups.data.$.isRb", true))"

是问题所在。它不会更新myQuery定义的对象。 运行代码三次后,下面的false应该都是真的。

"topups" : {
            "data" : [
                {
                        "val" : 12000000,
                        "chId" : 2,
                        "reqSys" : "222220002899",
                        "old" : NumberLong(189398),
                        "isRb" : true
                },
                {
                        "val" : 12000000,
                        "chId" : 2,
                        "reqSys" : "222220002899",
                        "old" : NumberLong(189398),
                        "isRb" : false
                },
                {
                        "val" : 12000000,
                        "chId" : 2,
                        "reqSys" : "222220002899",
                        "old" : NumberLong(189398),
                        "isRb" : false
                }
            ],
        "total" : {
                "cnt" : 0,
                "revenue" : 0
        }
},

这是代码..

BasicDBObject myQuery = new BasicDBObject();
myQuery.append("d", new BasicDBObject("$gte", dayOfYear - 2).append("$lte", dayOfYear))
.append("m", msisdn)
.append("topups.data.reqSys", reqSystem)
.append("topups.data.isRb", false)
.append("topups.data.chId", 2)
.append("topups.data.old", preEventBalance)
.append("topups.data.val", callCost);

BasicDBObject updateObj = new BasicDBObject();
updateObj.append("$set", new BasicDBObject("topups.data.$.isRb", true))
.append("$inc", new BasicDBObject("topups.total.revenue", -callCost)
.append("topups.total.cnt", -1));

mongoDBcollection.update(myQuery, updateObj);

3 个答案:

答案 0 :(得分:0)

我认为你正在寻找类似的东西,

http://docs.mongodb.org/manual/reference/method/db.collection.update/#update-a-document-element

该文档(针对2.4)表示它只会更新数组的第一个元素。所以我想使用$运算符无法完成。

您可以尝试通过更新单个元素来执行此操作,例如“topups.data.1.isRb”:true或使用更新的值创建外部数组并替换整个数组。

希望这有帮助。

答案 1 :(得分:0)

这看起来与此问题相同:How to Update Multiple Array Elements in mongodb

遗憾的是,答案是,您无法在一次操作中更新阵列中的所有文档。

答案 2 :(得分:0)

我不想一次更新所有记录(如上面的dex提及的票证或Trisha提到的问题的链接)。我想一次更新一个。

因此,如果上面的代码运行一次(并且所有“isRb”都为false),则所有三个列表成员都匹配“myQuery”,因此我希望将三个中的一个更改为“true”(不是全部三个)。

第二次代码运行时,两个列表成员匹配“myQuery”,所以我希望将两个中的一个更改为“true”(不是全部两个)。

第三次代码运行时,只有一个列表成员匹配“myQuery”,所以我希望将其更改为“true”(毕竟它是唯一一个在两次运行后留下“false”)。