如何在MongoDB中动态地$set子文档字段?

13

我遇到了这样一种情况,需要动态更新子文档中字段的值。该字段可能已经存在,也可能不存在。如果它不存在,我希望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);

});

但是我无法将值进行“upsert”操作。

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

非常感谢您的任何帮助。


不,这不是重复的。同样的问题,不同的解决方案。你甚至读了帖子吗?愚蠢的管理员。 - AJB
1
不需要这么粗鲁。解决方案在根本上有什么不同?它采用了编程方式构建$set对象的相同方法。 - JohnnyHK
1
因为它不起作用。在另一个不同的问题中提供的解决方案会引发错误,这也是我在原始问题中指出的。当我将$set操作符从placeholder对象中移出时,就得到了所需的解决方案,它起作用了。是的,在这里需要直言不讳。有太多人急于捞回一些甜蜜的失败者积分,施行他们的清洁服务,而他们应该把时间花费在仔细阅读问题上。 - AJB
1个回答

13

弄清楚了。

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

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

});

这会更新任何已经存在的字段,并在不存在时创建该字段/值对。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接