将新字段添加到嵌套数组中的所有文档

时间:2012-03-13 01:11:18

标签: mongodb

我有一个人员文件数据库。每个都有一个名为photos的字段,这是一组照片文档。我想为每个照片文档添加一个新的“已审核”标记,并将其初始化为false。

这是我尝试使用的查询:

db.person.update({ "_id" : { $exists : true } }, {$set : {photos.reviewed : false} }, false, true)

但是我收到以下错误:

SyntaxError: missing : after property id (shell):1

这是可能的,如果是的话,我在更新中做错了什么?

以下是“人物”文档的完整示例:

{
"_class" : "com.foo.Person",
"_id" : "2894",
"name" : "Pixel Spacebag",
"photos" : [
    {
        "_id" : null,
        "thumbUrl" : "http://site.com/a_s.jpg",
        "fullUrl" : "http://site.com/a.jpg"
    },
    {
        "_id" : null,
        "thumbUrl" : "http://site.com/b_s.jpg",
        "fullUrl" : "http://site.com/b.jpg"
    }]
}

任何可以告诉我清洁工为什么不使用查询{ "_id" : { $exists : true } }

更新“所有文件”的人的业力奖励

5 个答案:

答案 0 :(得分:8)

  

这是可能的,如果是的话,我在更新中做错了什么?

没有。一般来说,MongoDB只擅长对顶级对象进行更新。

这里的例外是$ positional operator。来自文档:Use this to find an array member and then manipulate it

但是,在您的情况下,您想要修改数组中的所有成员。所以这不是你需要的。

  

任何可以告诉我清洁工为什么更新“所有文件”的人的业力

尝试db.coll.update(query, update, false, true),这将发出“多”更新。最后true是使它成为多重的原因。

  

这可能,

这里有两个选项:

  1. 编写for循环以执行更新。它基本上是一个嵌套的for循环,一个循环遍历数据,另一个循环遍历子数组。如果你有很多数据,你会想要写这个是你选择的驱动程序(并且可能是多线程的)。
  2. 编写代码以处理reviewed为空。写下数据,如果遇到reviewed未定义的照片,则必须为false。然后,您可以适当地设置字段并将其提交回DB。
  3. 方法#2是你应该习惯的东西。随着数据的增长和添加字段,很难“反向移植”所有旧数据。这类似于在DB中有1B项时在SQL中发出架构更改的问题。

    相反,只需让代码抵制null,并学会将其视为默认代码。

    但是,这仍然不是你寻求的解决方案。

答案 1 :(得分:5)

对于那些仍在寻找答案的人来说,MongoDB 3.6可以使用全位置运算符$[]来查看docs

db.getCollection('person').update(
   {},
   { $set: { "photos.$[].reviewed" : false } },
   { multi: true}
)

答案 2 :(得分:-1)

你可以这样做

(null, {$set : {"photos.reviewed" : false} }, false, true)

第一个参数为null:no specification =集合中的任何项目。

“photos.reviewed”应声明为字符串以更新子字段。

答案 3 :(得分:-1)

你可以这样做:

db.person.update({}, $set:{name.surname:null}, false, true);

答案 4 :(得分:-1)

现在这个老主题,但这对Mongo 3.0.6来说效果很好:

db.users.update({ _id: ObjectId("55e8969119cee85d216211fb") }, { $set: {"settings.pieces": "merida"} })

在我的情况下,用户实体看起来像

{ _id: 32, name: "foo", ..., settings: { ..., pieces: "merida", ...} }