我正在使用node js mongodb driver
&尝试更新文档中对象数组内的object array
。
文档集的架构是:
我想要的:
对于order no = 1 & items.qty=2 & tax rate = 25
的收集,请更新tax to "cst" & taxratetype to "flat"
。
我尝试过的事情:
db.OrderInfo.aggregate(
{$match:{"orderno":"1"}},
{$unwind:'$items'},
{ $match: { 'items.qty' : 2}
},function(err,result1){
if(err){
throw(err);
}else{
indexes = result1[0].items.taxes.map(function(obj, index) {
if(obj.taxrate == 25) {
return index;
}
}).filter(isFinite);
var updateData = {};
updateData["items.$.taxes."+indexes[0]+".tax"]="cst";
updateData["items.$.taxes."+indexes[0]+".taxratetype"]="flat";
db.OrderInfo.update({ "orderno":"1",'items.qty': 2,'items.taxes.taxrate': 25 },{$set: updateData },function(err,result2){
console.log(result2);
});
}
});
目前我正在使用 db.eval 从节点运行此脚本,但稍后我会在完成相同操作后更改它。
出现此错误:
{“name”:“MongoError”,“message”:“错误:命令失败:{\ n \ t \”ok \“: 0,\ n \ t \“errmsg \”:\“管道元素3不是 object \“,\ n \ t \”代码\“:15942 \ n}:聚合失败 :\ n_getErrorWithCode@src/mongo/shell/utils.js:25:13个\ ndoassert@src/mongo/shell/assert.js:13:14个\ nassert.commandWorked@src/mongo/shell/assert.js:267: 5个\ nDBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5 \ n_funcs1 @:1:31 \ n “ ”OK“:0 ”ERRMSG“:” 错误: 命令失败:{\ n \ t \“ok \”:0,\ n \ t \“errmsg \”:\“管道元素3 不是对象\“,\ n \ t \”代码\“:15942 \ n}:聚合失败 :\ n_getErrorWithCode@src/mongo/shell/utils.js:25:13个\ ndoassert@src/mongo/shell/assert.js:13:14个\ nassert.commandWorked@src/mongo/shell/assert.js:267: 5个\ nDBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5 \ n_funcs1 @:1:31 \ n”, “代码”:139}
我从这个问题https://jira.mongodb.org/browse/SERVER-831知道 我无法使用直接更新命令&因此尝试这种解决方法。 此类更新的任何其他方法对我来说也没问题。
编辑: 根据@ titi23给出的答案,我曾尝试在函数内部使用[]。 它没有给我任何错误,但我的价值观也没有得到更新。
答案 0 :(得分:2)
查询中有两个问题:
1)您在[]
查询中遗漏了aggregate
。
2)更新方法不需要税率条款。它会找到嵌套文档&来自聚合的索引将用于更新目的。
有关如何使用它的更多信息,请参阅aggregate-definition。
语法 - db.collection.aggregate(管道,选项)
pipeline
- array - 一系列数据聚合操作或阶段。
请尝试以下方法: -
db.OrderInfo.aggregate([
{$match:{"orderno":"1"}},
{$unwind:'$items'},
{ $match: { 'items.qty' : 2} }]).toArray(
function(err,result1){
if(err){
throw(err);
}
else{
console.log(result[0]); //See is there any record here
indexes = result1[0].items.taxes.map(function(obj, index) {
if(obj.taxrate == 25) {
return index;
}
}).filter(isFinite);
var updateData = {};
updateData["items.$.taxes."+indexes[0]+".tax"]="cst";
updateData["items.$.taxes."+indexes[0]+".taxratetype"]="flat";
db.OrderInfo.update({ "orderno":"1",'items.qty': 2}, /*Remove the tax rate clause from here..*/
{$set: updateData },function(err,result2){
console.log(result2);
});
}
});
不应该抛出错误。
编辑: - 对聚合做toArray()
,看看是否有帮助。已经更新了查询。