2013-07-03 59 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