当前位置: 代码迷 >> JavaScript >> 替换数组字段值
  详细解决方案

替换数组字段值

热度:58   发布时间:2023-06-05 10:19:52.0

考虑以下mongo数据:

{ _id: "1",
  names: ["John", "Peter"]
}

替换数组中的简单元素的正确方法是什么,得到以下结果?

{ _id: "1",
  names: ["John", "Sarah"]
}

在我的代码中,我收到了一个将“ Peter”与“ Sarah”交换的函数,例如:

substituteItemOnArray = (id, from, to) => {
   MyModel.update({
      id: id
   },
   {
      ??? What is the correct way to substitute one element with another ???
   });

}

substituteItemOnArray("1", "Peter", "Sarah");

我不知道只有Mongo运营商能做到这一点。

我认为您将必须按ID检索文档,仅在该更新文档之后找到要替换的字符串的索引

下面的功能应该做我上面描述的

async substituteItemOnArray = (_id, from, to) => {
    const doc = await MyModel.findOne({  _id  });
    if (doc && doc.names && doc.names.indexOf(from) > -1) {

    const index = dox.names.indexOf(from); 
    const keyToUpdate = `names.${index}`;
    MyModel.update({ _id }, { $set: { [keyToUpdate] : to} },)
}

substituteItemOnArray("1", "Peter", "Sarah");

您可以在mongoose中使用mongoDB arrayFilters做到这一点:

function substituteItemOnArray = (id, from, to) {
  return MyModel.findOneAndUpdate(
    {id: id}, // where to update
    {$set: {'names.$[element]': to }}, // what to update
    {arrayFilters: [{'element': from}]} // what should match in array.
  )
}

(
  async () => {
    let doc = await substituteItemOnArray(id, "Peter", "Sarah");
    console.log(doc);
  }
)()

只需使用$位置运算符

db.getCollection('test').findOneAndUpdate(
  { names: "Peter" },
  { $set: { 'names.$': "Sarah" }}
)
  相关解决方案