[英]how to push a dictionary to a nested array with mongodb?
我的数据库中的数据看起来像这样
> db.whocs_up.find()
{ "_id" : ObjectId("52ce212cb17120063b9e3869"), "project" : "asnclkdacd", "users" : [ ] }
我试图像这样添加到'用户'数组:
> db.whocs_up.update({'users.user': 'usex', 'project' : 'asnclkdacd' },{ '$addToSet': { 'users': {'user':'userx', 'lastactivity' :2387843543}}},true)
但我得到以下错误:
Cannot apply $addToSet modifier to non-array
push
操作符也会发生同样的事情,我在做什么错? 我在2.4.8上
我尝试从此处遵循此示例: MongoDB-更新文档数组中的对象(嵌套更新)
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true)
python标签是因为当我遇到这个问题时我正在使用python,但是如您所见,它确实在mongo shell上起作用
EDIT
=============================
显然,如果我修改了更新
db.whocs_up.update({'users.user': 'usex', 'project' : 'asnclkdacd' },{ '$addToSet': { 'users': {'user':'userx', 'lastactivity' :2387843543}}},true)
对此:
db.whocs_up.update({'project' : 'asnclkdacd' },{ '$addToSet': { 'users': {'user':'userx', 'lastactivity' :2387843543}}},true)
它起作用了,但是谁能解释为什么两者不能达到相同的目的,据我所知,他们应该引用相同的文档并因此完成相同的事情, 'users.user': 'userx'
更新? 它是指数组中的某些内部文档,而不是整个文档吗?
这是MongoDB (SERVER-3946)中的一个已知错误。 当前,使用$push
/ $addToSet
在同一字段上进行查询的更新无法正常工作。
在一般情况下,有两种解决方法:
$push
/ $addToSet
进行更新的$addToSet
(如上所述)。 在查询中使用$all
运算符,提供包含查找值的单值数组。 例如代替这个:
db.foo.update({ x : "a" }, { $addToSet : { x : "b" } }, true)
做这个:
db.foo.update({ x : { $all : ["a"] } }, { $addToSet : { x : "b" } } , true)
在您的特定情况下,我认为您需要重新评估您要执行的操作。 您上面的更新操作将为每个唯一(用户,lastactivity)对添加一个新的阵列条目,这可能不是您想要的。 我假设您想要每个用户唯一的条目。
考虑更改架构,以便每个用户只有一个文档:
{
_id : "userx",
project : "myproj",
lastactivity : 123,
...
}
然后,更新操作将变为:
db.users.update({ _id : "userx" }, { $set : { lastactivity : 456 } })
通过在项目上添加二级索引,仍然可以有效地查找给定项目中的所有用户。
此架构还避免了上述架构无限制的文档增长,这对于性能而言是更好的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.