Javascript 替换数组字段值

Javascript 替换数组字段值,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,考虑以下mongo数据: { _id: "1", names: ["John", "Peter"] } 替换数组中简单元素的正确方法是什么,以获得以下结果 { _id: "1", names: ["John", "Sarah"] } 在我的代码中,我收到一个函数,将“Peter”与“Sarah”交换,如: 我不知道用Mongo操作员怎么做 我认为您必须按id检索文档,找到要替换的字符串的索引,并且仅在更新文档之后 下面的函数应该执行我上面描述的操作 async substituteI

考虑以下mongo数据:

{ _id: "1",
  names: ["John", "Peter"]
}
替换数组中简单元素的正确方法是什么,以获得以下结果

{ _id: "1",
  names: ["John", "Sarah"]
}
在我的代码中,我收到一个函数,将“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阵列过滤器执行此操作:

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" }}
)

names
是字符串数组吗?类似于
名称:[“约翰”、“彼得”]
。我相信数据也是数组的类型!我将在代码中更正…可能的重复可能的重复无论“Sarah”在数组中的位置如何,这都能起作用吗<代码>[“约翰”、“莎拉”]、[“莎拉”、“约翰”]、[“约翰”、“莎拉”、“彼得”]等。是的,您可以查看
db.getCollection('test').findOneAndUpdate(
  { names: "Peter" },
  { $set: { 'names.$': "Sarah" }}
)