arrays - 猫鼬替换索引前的值
问题描述
我有一个集合,里面有一个这样的数组(数组长度不同)
"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
获取输入_id
索引arrayName
$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
]
}
}
}]
)
推荐阅读
- flutter - Flutter:setState 在分页上不起作用
- reactjs - 如何添加图标 MUI 数据表?
- javascript - NextJS 在生产构建中错误的 CSS 顺序
- php - 从 foreach 循环的所有元素运行 jquery 函数
- java - 如何在环境路径上连接到 sqlite 数据库
- mongodb - mongdb 在某些变量存在时匹配,如果不存在,则不匹配
- python - 如何获得字符串 Scrapy 的结尾?
- kubernetes - 扩展 Kubernetes 2 主集群
- javascript - html中的数据没有变化
- python - 在anaconda-navigator的内核中启动python时出错