答案 0 :(得分:28)
使用负数索引,前缀为$ set,在mongo v2.2中测试:
> db.test.insert({'array': [4, 5, 6]})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 4, 5, 6 ] }
//prepend 3
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 3}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 3, 4, 5, 6 ] }
//prepend 2
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 2}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 2, 3, 4, 5, 6 ] }
//prepend 1
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 1}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 1, 2, 3, 4, 5, 6 ] }
答案 1 :(得分:22)
从MongoDB v2.5.3开始,有一个新的$position
运算符,您可以将$each
运算符作为$push
查询的一部分包含在内,以指定数组中的位置您想要插入一个值。
这是docs页面中的一个示例,用于在数组索引2 ::
处添加元素20和30db.students.update( { _id: 1 },
{ $push: { scores: {
$each: [ 20, 30 ],
$position: 2
}
}
}
)
参考:http://docs.mongodb.org/master/reference/operator/update/position/#up._S_position
答案 2 :(得分:5)
几天前有人问过类似的问题。不幸的是,简短的回答是“不”,但是对此功能有一个公开的要求 https://jira.mongodb.org/browse/SERVER-2191 - “$ push()到数组前面”
在另一个线程上有更多的信息和可能的解决方法:“将MongoDB数组用作堆栈” - Use MongoDB array as stack
希望以上内容有用,可帮助您找到可接受的解决方法。