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

时间:2014-07-27 21:53:12

标签: mongodb mongojs

我遇到过需要动态更新子文档中字段值的情况。该字段可能已存在,也可能尚未存在。如果它不存在,我想让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 个答案:

答案 0 :(得分:8)

想出来了。

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

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

});

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