在Mongodb数组中,有任何方法可以在特定元素位置之前/之后插入新元素

时间:2015-04-09 06:54:46

标签: arrays mongodb insert position

假设我有一个像

这样的文件
{
    "_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}

我使用以下命令

尝试将insert元素插入特定位置
db.collection.update(
     {
         "_id" : 5,
         "rows.id": "abc"
     },
     {
         '$push': {
             'rows': {
                '$each': [{ "id" : "qwe", "value":300} ],
                '$position': 2
             }
         }
     }
 )

它正在发挥作用。但问题是在这里我必须指定

'$position': 2

这是一个静态值。

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

事先通过一些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
             }
         }
     }
 );