如何在MongoDB中将值添加到数组的顶部?

16

我要如何在MongoDB中向数组顶部添加一个值?

假设我有这个文档在我的Mongo集合中:

{ "colors" : [ "red", "green", "blue" ] }

我该如何将"yellow"添加到列表的开头?

当我执行以下操作时:

{$push:{colors:"yellow"}}

我会得到这个:

{ "colors" : [ "red", "green", "blue", "yellow" ] }

i want this:

{ "colors" : [ "yellow", "red", "green", "blue"] }

提前感谢!


嘿@conman,你能否更改被接受的答案吗?谢谢! - Dan Dascalescu
3个回答

35

对于任何新手来说,MongoDB 2.6+ 支持 $position 操作符,可以用于实现所需的效果。这里的好处是您不需要返回整个文档数组、在本地更新并保存它——$position 操作符意味着可以原子性地完成操作。

您需要与 $each 结合使用:

$push: { colors: { $each: ['yellow'], $position: 0 } }

$push - $each - $position: 0 的语法很别扭。请通过投票解决这个问题来帮助实现 $unshift 功能。点击此链接参与投票:https://jira.mongodb.org/browse/SERVER-19974。 - Dan Dascalescu
感谢您的解决方法。我同意我们可以使用$unshift,但现在这个方法已经解决了问题。 - Mattijs

2
"unshift"在数组的开头插入数据,而"push"在末尾插入数据。例如,在JavaScript中:
> a = ['red','green','blue']
[ "red", "green", "blue" ]
> a.unshift("yellow")
4
> a
[ "yellow", "red", "green", "blue" ]

但不幸的是,Mongo API 不支持将其作为原子操作。

http://www.mongodb.org/display/DOCS/Updating

它仅支持“推送”。
你的数组有多大?
你可以假设Mongo中的数组总是反向存储,并使用push,或者读取数组,使用unshift进行修改,然后再次存储(虽然这不是原子操作)。

我不相信MongoDB支持unshift修改器。我尝试了以下操作:db.testarray.update({"_id": ObjectId("4df7a9e469408e69b19abd08")}, {$unshift: {colors: "pink"}}),但是出现了错误:指定了无效的修改器$unshift。 - Khon Lieu
10gen团队在改进MongoDB方面非常开放建议。你可以尝试将其作为API功能请求提交。 - Tilo
1
有一个功能请求:SERVER-2362 - Xiao
仅仅因为一个答案不再受支持就对其进行负评并不是很酷。 - Tilo
这不是一个 JavaScript 的问题。他在询问一个 MongoDb 的特性,而 MongoDb 并没有像 $unshift 这样的特性。 - user8737957
显示剩余3条评论

0
一个替代的方法是使用push()然后reverse()来进行unshift操作。如果您计划保持原始顺序,我不确定这是否适用于您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接