如何动态$设置mongodb中的子文档字段?

AJB*_*AJB 8 mongodb mongojs

我遇到了需要动态更新子文档中字段值的情况.该字段可能已存在,也可能尚未存在.如果它不存在,我想让mongo创建它.

这是我的Teams集合中的示例文档,用于存储任何给定团队的成员:

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

这是我正在使用的查询(我使用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);

});
Run Code Online (Sandbox Code Playgroud)

但我无法让它"贬值"这个价值.

我也发现了这个类似的问题,但该方法也不起作用: Nodejs Mongo插入子文档 - 动态字段名

在此先感谢您的帮助.

AJB*_*AJB 9

想出这个.

实质上,您需要在运行查询之前构建您尝试更新的子文档的"占位符"对象,如下所示:

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);

});
Run Code Online (Sandbox Code Playgroud)

这将更新已存在的任何字段,并创建字段/值对(如果尚不存在).