获取错误“管道元素3不是对象错误”,同时试图找到&使用汇总

时间:2016-06-08 08:58:28

标签: node.js mongodb aggregation-framework

我正在使用node js mongodb driver&尝试更新文档中对象数组内的object array

文档集的架构是:

enter image description here

我想要的:

对于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给出的答案,我曾尝试在函数内部使用[]。 它没有给我任何错误,但我的价值观也没有得到更新。

1 个答案:

答案 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(),看看是否有帮助。已经更新了查询。