Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在MongoDB中批量更新值数组?_Node.js_Mongodb - Fatal编程技术网

Node.js 如何在MongoDB中批量更新值数组?

Node.js 如何在MongoDB中批量更新值数组?,node.js,mongodb,Node.js,Mongodb,我有一个要用现有数组更新的值数组。我尝试使用$set它会抛出一个错误。如果我有一个要更新的值数组,它应该更新数组中的匹配项 1.如果我收集了以下文件 表格 [ { "id": 1, "name": "Fresh Mart", "products": [ { "name": "Onion", "qt

我有一个要用现有数组更新的值数组。我尝试使用
$set
它会抛出一个错误。如果我有一个要更新的值数组,它应该更新数组中的匹配项

1.如果我收集了以下文件

表格

[
  {
    "id": 1,
    "name": "Fresh Mart",
    "products": [
      {
        "name": "Onion",
        "qty": 10,
        "price": "85"
      },
      {
        "name": "Tomato",
        "qty": 10,
        "price": "85"
      }
    ]
  },
  {
    "id": 2,
    "name": "Alfred super market",
    "products": [
      {
        "name": "Onion",
        "qty": 10,
        "price": "85"
      },
      {
        "name": "Tomato",
        "qty": 10,
        "price": "85"
      }
    ]
  }
]


Following query updates one product in first document:
查询

db.collection.update({
  "$and": [
    {
      id: 1
    },
    {
      "products.name": "Onion"
    }
  ]
},
{
  "$set": {
    "products.name": "Onion Updated"
  }
})
我尝试使用以下查询更新第一个文档中的两个产品:

db.collection.update({
  "$and": [
    {
      id: 1
    },
    {
      "products.name":  [ "Onion", "Tomato" ] 
    }
  ]
},
{
  "$set": {
    "products.name": "Onion Updated"
  }
})
我使用了
$addToSet
它不允许重复。可以将现有值替换为
$addToSet

但是它没有更新文档。

这个答案就是这个答案的动态方法

  • 配置您的有效负载
  • 准备
    阵列过滤器
    设置
    条件
  • 更新查询

是的,正在工作以及如何更新值的倍数。不,他们采用单个有效负载并更新了多个字段。在这种情况下,我应该采用有效负载的倍数,并应使用这两种蔬菜更新字段的倍数显示查询。不起作用的一个。{“$and”:[{id:1},{“products.name”:[“洋葱”,“西红柿”]}}}您至少需要每个名称的旧名称和更新名称之间的映射。
db.collection.update({
  id: 1
},
{
  "$addToSet": {
    "products": {
      "$each": [
        {
          "name": "Onion Updated",
          "qty": 10,
          "price": "85"
        },
        {
          "name": "Tomato Updated",
          "qty": 10,
          "price": "85"
        }
      ]
    }
  }
})
let id = 1;
let updateName = [
  {
    oldName: "Onion",
    newName: "Onion Updated"
  },
  {
    oldName: "Tomato",
    newName: "Tomato Updated"
  },
];
let arrayFilters = [];
let set = {};

updateName.forEach((v, i) => {
  arrayFilters.push({ ["p"+i]: v.oldName });
  set["products.$[p"+i+"].name"] = v.newName;
});
db.collection.update(
  { id: id },
  { $set: set },
  { arrayFilters: arrayFilters }
)