如何向大于数组大小的位置插入值,中间位置用null填充。
原始数据库:
[
{
"arr": ["a", "b"]
},
{
"arr": ["a", "b", "c"]
}
]
我想要什么(在第5个索引处插入“f”):
[
{
"arr": ["a", "b", null, null, null, "f"]
},
{
"arr": ["a", "b", "c", null, null, "f"]
}
]
如果 size 小于位置,$push
运算符会将元素追加到末尾。
此外,这必须在单个
updateMany()
调用中完成。
发现一个与此类似的问题,但没有答案。
我尝试过但不起作用:
$push: { arr: { $each: [null, null, null, null], $slice: 4 },
$push: { arr: "f" }
这样做的规范方法之一:
$unwind
使用 includeArrayIndex
选项为数组索引生成字段 idx
。$set
arr
的内容由 idx
idx
大于您指定索引的文档$merge
更新回收藏db.collection.aggregate([
{
"$set": {
arr: {
"$concatArrays": [
"$arr",
{
"$map": {
"input": {
"$range": [
0,
// your indexInput here
5
]
},
"as": "entry",
"in": null
}
}
]
}
}
},
{
"$unwind": {
path: "$arr",
includeArrayIndex: "idx"
}
},
{
"$set": {
"arr": {
"$cond": {
"if": {
$eq: [
"$idx",
// your inputIdx here
5
]
},
"then": // your input here
"f",
"else": "$arr"
}
}
}
},
{
"$match": {
idx: {
$lte: // your inputIdx here
5
}
}
},
{
"$group": {
"_id": "$_id",
"arr": {
"$push": "$arr"
}
}
},
{
"$merge": {
"into": "collection"
}
}
])