代码之家  ›  专栏  ›  技术社区  ›  AJB

如何在mongodb中动态设置子文档字段?[副本]

  •  13
  • AJB  · 技术社区  · 12 年前

    我遇到了需要动态更新子文档中字段值的情况。该字段可能存在,也可能不存在。如果它不存在,我希望mongo创建它。

    下面是一个示例文档,可以在我的 Teams 集合,用于存储任何给定团队的成员:

    {
      _id : ObjectId('JKS78678923SDFD678'),
      name : "Bob Lawblaw",
      status : "admin",
      options : {
        one : "One",
        two : "Two"
      }
    }
    

    下面是我正在使用的查询 mongojs 作为我的mongo客户端)尝试在 options 子文档:

    var projectID = 'JKS78678923SDFD678';
    var key = 'Three';
    var value = 'Three';
    
    Teams.findAndModify({
        query: {
            projectID:mongojs.ObjectId(projectID)
        },
        update: {
            $set : { options[key] : value }
        },
        upsert: true,
        multi: false,
        new: true
    },
    function(error, result, lastErrorObject){
    
        console.log(result);
    
    });
    

    但我不能让它“颠覆”价值。

    我也发现了类似的问题,但这种方法也不起作用: Nodejs Mongo insert into subdocument - dynamic fieldname

    提前感谢您的帮助。

    1 回复  |  直到 9 年前
        1
  •  13
  •   AJB    12 年前

    想好了。

    本质上,在运行查询之前,您需要构造要更新的子文档的“占位符”对象,如下所示:

    var projectID = 'JKS78678923SDFD678';
    
    var key = 'Three';
    var value = 'Three';
    
    var placeholder = {};
    placeholder['options.' + key] = value;
    
    Teams.findAndModify({
        query: {
            projectID:mongojs.ObjectId(projectID)
        },
        update: {
            $set : placeholder
        },
        upsert: true,
        multi: false,
        new: true
    },
    function(error, result, lastErrorObject){
    
        console.log(result);
    
    });
    

    这将更新所有已存在的字段,并在字段/值对不存在时创建字段/值。