问题描述
考虑以下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");
1楼
Arif
1
2019-02-21 13:28:00
我不知道只有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");
2楼
Daksh Miglani
1
2019-02-21 13:36:17
您可以在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);
}
)()
3楼
Ashh
1
已采纳
2019-02-21 16:07:33
只需使用$
位置运算符
db.getCollection('test').findOneAndUpdate(
{ names: "Peter" },
{ $set: { 'names.$': "Sarah" }}
)