mongodb 更新Mongo DB中的嵌套数组元素

qzwqbdag  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(153)

我有“项目”集合如下。我想更新“用户”和“所有者”中的电子邮件域为“@ mailm365.com“

{
"_id" : ObjectId("637e0af92ce49a1a816807bc"),
"title" : "Project-1",
"description" : "Project-1 Description",
"users" : [ 
    {
        "_id" : ObjectId("5f8881823542b1b499d7b351"),
        "fullname" : "User-1",
        "email" : "user-1@mail.com"
    }
],
"owners" : [ 
    {
        "_id" : ObjectId("5f8881823542b1b499d7b351"),
        "fullname" : "User-2",
        "email" : "user-2@mail.com"
    }, 
    {
        "_id" : ObjectId("61fb71ca294d34537dafe4c9"),
        "fullname" : "User-3",
        "email" : "user-3@mail.com"
    }
]}

我已经尝试了以下查询,但没有成功。有任何帮助使此更新查询工作吗?

db.Project.find().forEach(function(project)
{
  project.users.forEach(function(user){
    var updatedDomain = user.email.replace('@mail.com', '@mailm365.com');
    user.email = updatedDomain;
  });

  project.owners.forEach(function(owner){
    var updatedDomain = owner.email.replace('@mail.com', '@mailm365.com');
    owner.email = updatedDomain;
  });
  
  db.Project.updateOne(
    {
      _id:project._id
    },
    {
       $set:
            {
                "users": project.users,
                "owners": project.owners
            }
    }   
    );
});
kxeu7u2r

kxeu7u2r1#

查询

  • 您需要管道更新,因为您希望基于以前值进行更新,并且您还需要$split函数,该函数是管道运算符
  • 2次相同代码
  • $map$this将成为文档成员,$mergeObjects将成为新的电子邮件成员
  • 新电子邮件与旧电子邮件分离,取@前的第一部分,并将其与@mailm365.com新docmain名称连接
  • 这是为所有用户做的,如果你想只为某些所有者做,你可以在map里面添加一个$cond来只在特定的

PLaymongo

update(
{"_id": {"$eq": ObjectId("637e0af92ce49a1a816807bc")}},
[{"$set": 
   {"users": 
     {"$map": 
       {"input": "$users",
        "in": 
         {"$mergeObjects": 
           ["$$this",
             {"email": 
               {"$concat": 
                 [{"$first": {"$split": ["$$this.email", "@"]}},
                  "@mailm365.com"]}}]}}}}},
 {"$set": 
   {"owners": 
     {"$map": 
       {"input": "$owners",
        "in": 
         {"$mergeObjects": 
           ["$$this",
             {"email": 
               {"$concat": 
                 [{"$first": {"$split": ["$$this.email", "@"]}},
                  "@mailm365.com"]}}]}}}}}],
{"multi": true})

相关问题