当前位置: 首页 > 知识库问答 >
问题:

当尝试使用聚合查找和更新时,得到错误“管道元素3不是一个对象错误”

巫新知
2023-03-14

我正在使用节点js mongodb驱动程序&试图更新文档中对象数组中的对象数组

文档集合的架构如下:

我想要的是:

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从node运行这个脚本,但是一旦我完成了同样的任务,稍后将对其进行更改。

获取此错误:

{“name”:“mongoerror”,“message”:“error:command failed:{\n\t\”ok“:0,\n\t\”errmsg\“:\”管道元素3不是对象\“,\n\t\”code“: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.:31\n”,“确定”:0,“errmsg”:“错误:命令失败:{\n\t”确定“: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@:1:31\n”,“代码”:139}

从这个问题https://jira.mongodb.org/browse/server-831中我知道我不能使用直接更新命令,因此尝试了这个解决方案。对于这样的更新,任何其他方法对我来说也很好。

编辑:根据@titi23给出的答案,我已经尝试在函数内部使用[]。它没有给我任何错误,但我的价值观也没有得到更新。

共有1个答案

袁琪
2023-03-14

查询中的两个问题:

1)在聚合查询中缺少[]

2)update方法不需要税率子句,它将查找嵌套文档&来自聚合的索引将在update中起到作用。

有关如何使用它的更多信息,请参阅聚合定义。

语法-db.collection.aggregate(管道、选项)

管道-数组-数据聚合操作或阶段的序列。

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

 类似资料:
  • 当我试图在flash插件和red5服务器安装之间建立连接时,我得到了以下错误。请帮帮我. [ERROR][rtmpConnectionExecutor#dtqatxjixlu78-1]org.red5.server.net.rtmp.basertmphandler-Exception java.lang.nosuchmethoderror:org.red5.server.scope.scope$c

  • 我正忙于一个小的web应用程序,我正试图使用RestService向一个API发布,但却一直收到一个400坏的请求。当我使用失眠Rest客户端做完全相同的帖子时,我会得到200分...你知道我做错了什么吗/我可以看什么来发现发生了什么吗? 更新:原来问题是一个不正确的头,仍然有一个未解决的错误,我正在尝试添加正确的头...此处为问题继续链接 rest.service.ts中的submitStock

  • 我试着根据它们所拥有的,过滤一个2个向量的字符串。我的意思是我的向量fvalues包含和另一个向量xbarl,该向量是使用函数递归创建的,以生成基于数字=2的二进制数。我想对这两个值进行排序,并将xbarl中的值(不在fvalues中)排序为另一个向量字符串。因此,使用上面的示例,我希望第三个向量包含,它应该是一个字符串。 这是我的代码,但在最后一个for循环中,我实际上执行了过滤,它给了我一个错

  • 我试图得到一个简单的示例,使用Apache Spark 1.1.1、Cassandra 2.0.11和spark-cassandra-connector(V1.1.0)将行从Cassandra映射到scala case类。我在spark-cassandra-connector github页面、planetcassandra.org、datastax上查看了文档,并进行了搜索;但没有发现其他人遇到

  • 问题内容: 我尝试通过bash脚本执行此命令,但出现以下错误: 错误stacktrace: {“错误”:“ IndexPrimaryShardNotAllocatedException [[my_index]主要未分配后api]”,“状态”:409} {“错误”:“ ElasticSearchIllegalArgumentException [无法更新非动态设置[[index.analysis.f

  • 我用的是reactjs。我正在使用material表获取可编辑表中的数据。但是我得到了一个像图片一样的错误,我怎样才能修复这个错误呢? 我使用useState进行表格的编辑设置。你能帮我纠正一下错误吗? 我在接收数据时没有收到任何错误。我只是在表格上使用活动/非活动编辑。但是 为行提供错误。 下面是错误截图和我的源代码