猫鼬替换索引之前的值



我有一个集合,在if(数组长度不同(内部有一个这样的数组

"arrayName": [
{"name": "D", "_id": ObjectId(IDOFD)},
{"name": "C", "_id": ObjectId(IDOFC)},
{"name": "B", "_id": ObjectId(IDOFB)},
{"name": "A", "_id": ObjectId(IDOFA)}
]

我试图替换该数组中某个元素之前的所有值-比如我想用"_id": ObjectId(IDOFB)替换该元素之前的每个元素(如果具有此id的元素是该数组的最后一个元素,则只需在指定元素之后推送"replacementValues"数组(:

"replacementValues": [
{"name": "REPLACE 1", "_id": ObjectId(IDOFREPLACE 1)},
{"name": "REPLACE 2", "_id": ObjectId(IDOFREPLACE 2)}
]

这将导致:

"arrayName": [
{"name": "D", "_id": ObjectId(IDOFD)},
{"name": "C", "_id": ObjectId(IDOFC)},
{"name": "B", "_id": ObjectId(IDOFB)},
{"name": "REPLACE 1", "_id": ObjectId(IDOFREPLACE 1)},
{"name": "REPLACE 2", "_id": ObjectId(IDOFREPLACE 2)}
]

我怎样才能做到这一点?如有任何帮助,我们将不胜感激!

您可以从MongoDB 4.2、开始使用带有聚合管道的更新

  • $indexOfArray获取arrayName中输入_id的索引
  • $add在以上返回索引中加一,因为索引从零开始
  • $slice获取返回索引以上的所有元素
  • $concatArrays将返回元素连接到上面,然后输入替换数组
let replacementValues = [
{ "name": "REPLACE 1", "_id": ObjectId(IDOFREPLACE 1) },
{ "name": "REPLACE 2", "_id": ObjectId(IDOFREPLACE 2) }
];
let _id = ObjectId(IDOFB);
YourSchemaModel.updateOne(
{}, // put your query
[{
$set: {
arrayName: {
$concatArrays: [
{
$slice: [
"$arrayName",
0,
{
$add: [
{ $indexOfArray: ["$arrayName._id", _id] },
1
]
}
]
},
replacementValues
]
}
}
}]
)

游乐场

最新更新