mongodb $ 导致错误位置运算符没有从查询中找到所需的匹配

Mel*_*y C 5 mongodb

我\xe2\x80\x99一直在尝试更新我的mongoDB中的数据。\n我想使用新的productName字段更新所有产品。

\n

我的数据看起来像:

\n
{\n    "id": "12345",\n    "products": [{\n        "id": 0\n        "productCode": "test",\n        "status": "PENDING",\n    },\n    {\n        "id": 1\n        "productCode": "test",\n        "status": "COMPLETE",\n    }],\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我尝试以下操作时。我收到此错误位置运算符未从查询中找到所需的匹配项。

\n
db.customers.updateMany(\n  { id: "12345" },\n  { $set: {\n    "products.$.productName": "Name here" } \n  }\n)\n
Run Code Online (Sandbox Code Playgroud)\n

如果我执行 account.0.productName 那么它 \xe2\x80\x99s 很好并更新。I\xe2\x80\x99m 不确定为什么 $ 对我不起作用

\n
db.customers.updateMany(\n  { id: "12345" },\n  { $set: {\n    "products.0.productName": "Name here" } \n  }\n)\n
Run Code Online (Sandbox Code Playgroud)\n

J.F*_*.F. 12

位置运算符不起作用,因为您没有将数组用于find(第一个对象)

如果您尝试查询,它将按预期工作,因为您通过 找到了位置products.id

否则,如果您没有更新数组的位置,则无法$以这种方式使用运算符。您需要这个查询:

db.collection.update({
  "id": "12345",
  
},
{
  "$set": {
    "products.$[].newField": "test2"
  }
},
{
  "multi": true
})
Run Code Online (Sandbox Code Playgroud)

Mongo 游乐场示例在这里

使用$[]您可以引用数组并将值添加到每个对象中。

$[]文档在这里

它说:

所有位置运算符 $[] 指示更新运算符应修改指定数组字段中的所有元素。

这正是我们想要的:)