mongodb Mongoose Model.updateMany不替换数组

cld4siwp  于 2023-10-16  发布在  Go
关注(0)|答案(3)|浏览(95)

我很难用mongoose/mongodb替换字段
我有一些文件看起来像这样:

{account:1234, myArray:[a,b,c]}
const newArray = [d,e,f];

const result = await Model.updateMany({
    account:1234,
  }, {
    $set:{
      // 'testUpdating':4,
      'myArray':newArray,
    }
  });

我得到了这个结果:

{
 "ok": 0,
 "n": 0,
 "nModified": 0
}

但是,如果我取消注解testUpdating:4更新,我会得到更新了18 k文档的预期结果,但是只有'testUpdating'字段被修改。
我要么做错了什么,要么它只是拒绝用新数组更新数组字段。

lpwwtiir

lpwwtiir1#

你的Model.updateMany()看起来很好,应该用你想要的结果更新所有匹配的文档。
这可能是一个模式定义问题。
请确保使用实际需要的类型数组定义myArray属性,并将这些数据类型传递给updateMany。例如,如果你的myArray是一个字符串数组,那么你的schema看起来会像这样:

const schema = new mongoose.Schema({
    account: {
        type: Number
    },
    testUpdating: {
        type: Number
    },
    myArray: [String] //< An array of strings i.e. ['a', 'b', 'c']

});

然后,当你执行updateMany时,确保你传入一个字符串数组,如下所示:

const newArray = ['d', 'e', 'f']; //< An array of strings

const result = await Model.updateMany({
    account:1234,
}, {
   $set:{
     'testUpdating':4,
     'myArray':newArray,
   }
});

如果你想存储一个不同类型的数组(而不是字符串),那么看看文档中的一个可用选项的例子。

qpgpyjmq

qpgpyjmq2#

  • update()示例正在运行:

upsert : true表示如果未找到记录则将创建记录
upsert : false表示如果未找到记录,则不会创建记录
简单来说就是insert + update = upsert
multi:true更新多个文档,而multi:false更新单个文档

数据:

[
      {
        account: 1234,
        myArray: ["a","b","c"]
      },
       {
        account: 1234,
        myArray: ["a","b","c"]
      }
    ]

更新聚合:

db.collection.update({
  "account": 1234
},
{
  "$set": {
    "myArray": [
      "d",
      "e",
      "f"
    ]
  }
},
{
  "multi": true,
  "upsert": false
})

输出:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "account": 1234,
    "myArray": [
      "d",
      "e",
      "f"
    ]
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "account": 1234,
    "myArray": [
      "d",
      "e",
      "f"
    ]
  }
]
o4tp2gmn

o4tp2gmn3#

原来是一个同事重写了updateMany函数,这就解释了为什么会这么奇怪。

相关问题