繁体   English   中英

如何使用mongodb将字典推送到嵌套数组?

[英]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在同一字段上进行查询的更新无法正常工作。

在一般情况下,有两种解决方法:

  1. 重组您的更新操作,不必查询也要使用$push / $addToSet进行更新的$addToSet (如上所述)。
  2. 在查询中使用$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM