在MongoDB中多次推送和切片

时间:2013-07-03 20:03:49

标签: mongodb

我正在尝试为一个上限数组推送一个新值:

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"
]
}

可能我不理解如何使用$ slice使用$ push,但是查看文档我无法弄清楚我做错了什么。如何在加盖数组中添加新元素?

1 个答案:

答案 0 :(得分: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中添加了$ push对$ push的支持

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

很可能你使用的是旧版本的MongoDB,它不支持每个$ push运算符。你在运行什么版本的MongoDB?您可以使用MongoDB shell中的以下命令找到您正在运行的版本。

>db.version()

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

http://www.mongodb.org/downloads