在 Mongodb 数组中,有没有办法在特定元素位置之前/之后插入新元素

Posted

技术标签:

【中文标题】在 Mongodb 数组中,有没有办法在特定元素位置之前/之后插入新元素【英文标题】:In Mongodb array is there any way to insert a new element before/after a specific element position 【发布时间】:2015-06-14 10:05:07 【问题描述】:

假设我有一个类似的文档


    "_id" : 5,
    "rows": [
         "id" : "aab", "value":100,
         "id" : "aac", "value":400,
         "id" : "abc", "value":200,
         "id" : "xyz", "value":300,
    ]

我需要在“rows”数组中插入一个新的子文档

 "id" : "qwe", "value":300

元素位置之前

 "id" : "abc", "value":200

我尝试了使用以下命令将元素插入特定位置的命令

db.collection.update(
     
         "_id" : 5,
         "rows.id": "abc"
     ,
     
         '$push': 
             'rows': 
                '$each': [ "id" : "qwe", "value":300 ],
                '$position': 2
             
         
     
 )

它正在工作。但问题出在这里我必须指定

'$position': 2

这是一个静态值。

我的要求是在数组中的特定元素之前插入一个新元素。也就是说,位置可能是动态值。

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

通过事先进行一些 javascript 操作,您可以使用 map 函数获取需要插入新元素的特定数组对象元素的索引。首先,使用集合上的 findOne() 方法从文档中获取行数组:

var rows = db.collection.findOne("_id": 5, "rows.id": "abc").rows,
    pos = rows.map(function(e)  return e.id; ).indexOf("abc");

然后在更新语句中使用变量pos

db.collection.update(
     
         "_id" : 5,
         "rows.id": "abc"
     ,
     
         "$push": 
             "rows": 
                "$each": [ "id" : "qwe", "value":300 ],
                "$position": pos
             
         
     
 );

【讨论】:

以上是关于在 Mongodb 数组中,有没有办法在特定元素位置之前/之后插入新元素的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:从数组的开头删除一定数量的元素

单击元素时从 mongodb 中删除特定的数组元素

有没有办法在不输入数组 [somenumber] 的情况下获取数组内的特定对象?

仅删除(更新查询)数组mongodb数组中的特定元素?

如何从数组中读取特定元素,该元素是来自 mongodb 的车把文件中对象的一部分?

(AZURE cosmosDB/mongoDB) 更新数组中对象的特定元素的字段