2013-07-03 24 views
2

我试图做一个推一个新值上限阵列:Push和切片多次

db.messages.insert({name:"test1"}) 
db.messages.update({name:"test1"}, {"$push":{"output": {"$each": ["test1"], "$slice": -10}}}) 
db.messages.update({name:"test1"}, {"$push":{"output": {"$each": ["test2"], "$slice": -10}}}) 

于是,我第一次执行更新,我得到了我期望:

{ 
"_id" : ObjectId("51d482ee7252cb3f7eb81ac1"), 
"name" : "test1", 
"output" : [ 
    "test1" 
] 
} 

但是,第二次更新后,我得到如下:

{ 
"_id" : ObjectId("51d482ee7252cb3f7eb81ac1"), 
"name" : "test1", 
"output" : [ 
    "test1", 
    { 
     "$each" : [ 
      "test2" 
     ], 
     "$slice" : -10 
    } 
] 
} 

当我预计以下几点:

{ 
"_id" : ObjectId("51d482ee7252cb3f7eb81ac1"), 
"name" : "test1", 
"output" : [ 
    "test1", 
    "test2" 
] 
} 

也许我不理解如何使用$推与$切片,但看看文档我无法弄清楚我做错了什么。 achive如何将一个新元素添加到一个封顶阵列?

+1

我想,你在我蒙戈外壳中提到的相同的指令,我能得到预期的输出。您是否使用db.messages.find()查询来查看集合? – Sai

+0

是的,我正在使用db.messages.find()。但是,现在我阅读了您的评论,我想我知道发生了什么:我使用的是2.2版本,其中文档指出$ slice修饰符可用于2.4中的$ push。谢谢! – dgaviola

+0

啊哈!很好的发现。尝试使用下一个版本,然后让我们知道它是否可行。然后,您可以创建自己的答案,并接受它,以便将来遇到同样问题的读者会有用!! :) – Sai

回答

1

您观察到的行为可以在MongoDB 2.2版中重现。你的榜样按预期工作MongoDB中的2.4版本

> db.things.insert({name:"test1"}) 
> db.things.update({name:"test1"}, {"$push":{"output": {"$each": ["test1"], "$slice": -10}}}) 
> db.things.find() 
{ "_id" : ObjectId("51d489f730d17c1ffbd6ff9f"), "name" : "test1", "output" : [ "test1" ] } 
> db.things.update({name:"test1"}, {"$push":{"output": {"$each": ["test2"], "$slice": -10}}}) 
> db.things.find() 
{ "_id" : ObjectId("51d489f730d17c1ffbd6ff9f"), "name" : "test1", "output" : [ "test1", "test2" ] } 

从文档,每个支持美元$推动运营商的版本中添加2.4

http://docs.mongodb.org/manual/reference/operator/each/#op._S_each

最有可能你使用的是旧版本的使用$ push操作符不支持$ each的MongoDB。你在运行什么版本的MongoDB?您可以使用MongoDB shell中的以下命令找出正在运行的版本。

>db.version() 

要获得最新版本的MongoDB,请转到以下链接。

http://www.mongodb.org/downloads