【问题标题】:Update attribute value in nested array更新嵌套数组中的属性值
【发布时间】:2015-09-23 05:31:47
【问题描述】:

我的名为 user 的集合有 6 个字段。配置文件字段是文档。它只有一个名为 Packages 的数组。 Packages 是文档的集合,包含当前用户拥有的所有包。

我的数据库是这样的:

{
  "_id" : "AayujR3SLT5MtmTKf",
  "createdAt" : ISODate("2015-09-18T07:19:05.069Z"),
  "services" : {
    "password" : {
      "bcrypt" : "encripted_password_here"
    }
  },
  "username" : "test_user",
  "emails" : [{
      "address" : "1@gmail.com",
      "verified" : false
    }],
  "profile" : {
    "packages" : [{
        "packageId" : "67fmCMNTdqejFs7NE",
        "name" : "package1"
        "active" : true
      }, {
        "packageId" : "Dcn4PkmHNe8APuk73",
        "name" : "package2"
        "active" : true
      }, {
        "packageId" : "yvdXkPeNHEWwwLKjC",
        "name" : "package2"
        "active" : true
      }]
  }
}

我想将所有活动设置为 false。我该怎么办?我当前的代码就像(不工作):

Meteor.users.update({ _id: Session.get('user_id') }, { $set: {'profile.packages.active': false} });

【问题讨论】:

标签: mongodb meteor


【解决方案1】:

它不能在单个查询中完成,因为“包”数组中有很多元素。即使您尝试以下查询,当前文档中也只会更新第一个匹配项,其余匹配项将保持不变。

db.exp10.update({"profile.packages.active":true},{$set:{"profile.packages.$.active":false}},{multi:true})

输出:

{
        "_id" : "AayujR3SLT5MtmTKf",
        "createdAt" : ISODate("2015-09-18T07:19:05.069Z"),
        "services" : {
                "password" : {
                        "bcrypt" : "encripted_password_here"
                }
        },
        "username" : "test_user",
        "emails" : [
                {
                        "address" : "1@gmail.com",
                        "verified" : false
                }
        ],
        "profile" : {
                "packages" : [
                        {
                                "packageId" : "67fmCMNTdqejFs7NE",
                                "name" : "package1",
                                "active" : false
                        },
                        {
                                "packageId" : "Dcn4PkmHNe8APuk73",
                                "name" : "package2",
                                "active" : true
                        },
                        {
                                "packageId" : "yvdXkPeNHEWwwLKjC",
                                "name" : "package2",
                                "active" : true
                        }
                ]
        }
}

所以我们可以使用下面的代码更好地做到这一点:

db.user.find({"profile.packages.active":true}).forEach(function(doc){
for( var count = 0; count < doc.profile.packages.length; count++ )
{
    if( doc.profile.packages[count].active == true )
        doc.profile.packages[count].active = false;     
}
db.user.save(doc);
});

输出:

{
        "_id" : "AayujR3SLT5MtmTKf",
        "createdAt" : ISODate("2015-09-18T07:19:05.069Z"),
        "services" : {
                "password" : {
                        "bcrypt" : "encripted_password_here"
                }
        },
        "username" : "test_user",
        "emails" : [
                {
                        "address" : "1@gmail.com",
                        "verified" : false
                }
        ],
        "profile" : {
                "packages" : [
                        {
                                "packageId" : "67fmCMNTdqejFs7NE",
                                "name" : "package1",
                                "active" : false
                        },
                        {
                                "packageId" : "Dcn4PkmHNe8APuk73",
                                "name" : "package2",
                                "active" : false
                        },
                        {
                                "packageId" : "yvdXkPeNHEWwwLKjC",
                                "name" : "package2",
                                "active" : false
                        }
                ]
        }
}

附注:

如果集合有很多文档,为了更好的性能我们可以使用Bulk Operations

【讨论】:

    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多