gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:41:26 25 4
gpt4 key购买 nike

我的数据库中有这样的数据

> 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 - Update objects in a document's array (nested updating)

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 上工作,如您所见

编辑 ============================== 开始工作了

显然如果我修改更新来自

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 更新的字段(正如您在上面所做的那样)。
  2. 在查询中使用 $all 运算符,提供包含查找值的单值数组。例如而不是这个:

    db.foo.update({ x : "a" }, { $addToSet : { x : "b" } }, true)

    这样做:

    db.foo.update({ x : { $all : ["a"] } }, { $addToSet : { x : "b" } } , true)

在您的具体情况下,我认为您需要重新评估您尝试执行的操作。您上面的更新操作将为每个唯一的 (user, lastactivity) 对添加一个新的数组条目,这可能不是您想要的。我假设您希望每个用户都有一个唯一的条目。

考虑更改您的架构,以便每个用户有一个文档:

{ 
_id : "userx",
project : "myproj",
lastactivity : 123,
...
}

然后更新操作变成这样:

db.users.update({ _id : "userx" }, { $set : { lastactivity : 456 } })

通过在项目上添加二级索引,仍然可以有效地查找给定项目中的所有用户。

该模式也避免了上述模式的无限文档增长,这对性能更好。

关于javascript - 如何使用 mongodb 将字典推送到嵌套数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21011622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com