我希望通过一个列表中的对象中的某些值查找文档,并更新列表对象值。 虽然它通过列表值找到文档并减去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);
答案 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”)。