猫鼬在索引之前替换值
mongoose replace values before index
我有一个集合,在 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)}
]
我怎样才能做到这一点?
任何帮助将不胜感激!
您可以使用 update with aggregation pipeline 从 MongoDB 4.2 开始,
$indexOfArray
在 arrayName
中获取输入 _id
的索引
$add
在上面的 return 索引中加一,因为索引从零开始
$slice
获取所有高于 return index 的元素
$concatArrays
连接以上 return 个元素,然后输入替换数组
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
]
}
}
}]
)
我有一个集合,在 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)}
]
我怎样才能做到这一点? 任何帮助将不胜感激!
您可以使用 update with aggregation pipeline 从 MongoDB 4.2 开始,
$indexOfArray
在arrayName
中获取输入 $add
在上面的 return 索引中加一,因为索引从零开始$slice
获取所有高于 return index 的元素
$concatArrays
连接以上 return 个元素,然后输入替换数组
_id
的索引
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
]
}
}
}]
)