我正在尝试为一个上限数组推送一个新值:
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,但是查看文档我无法弄清楚我做错了什么。如何在加盖数组中添加新元素?
答案 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,请转到以下链接。