【问题标题】:How to dynamically $set a subdocument field in mongodb? [duplicate]如何在 mongodb 中动态 $set 子文档字段? [复制]
【发布时间】:2014-07-28 06:35:51
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

  • 不,这不是重复的。同样的问题,不同的解决方案。你甚至读过这篇文章吗?愚蠢的看门人。
  • 不必粗鲁。解决方案有何根本不同?这与以编程方式构建 $set 对象的方法相同。
  • 因为它不起作用。另一个不同问题中说明的解决方案会引发错误。我在原始问题中指出。当我将$set 运算符移出placeholder 对象时,我最终得到了所需的解决方案,该解决方案有效。而且,是的,这里有必要直言不讳。有太多人在真正应该花时间仔细阅读问题时,通过捐赠他们的清洁服务来获得甜蜜,甜蜜的失败者积分。

标签: mongodb mongojs


【解决方案1】:

想通了。

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

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

});

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 2014-11-12
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2019-07-23
    相关资源
    最近更新 更多