Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mongodb中动态设置子文档字段?_Mongodb_Mongojs - Fatal编程技术网

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

如何在mongodb中动态设置子文档字段?,mongodb,mongojs,Mongodb,Mongojs,我遇到了需要动态更新子文档中字段值的情况。该字段可能存在,也可能不存在。如果它不存在,我希望mongo创建它 下面是一个示例文档,可以在我的Teams集合中找到,它用于存储任何给定团队的成员: { _id : ObjectId('JKS78678923SDFD678'), name : "Bob Lawblaw", status : "admin", options : { one : "One", two : "Two" } } 下面是我正在使用的查询(我

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

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

{
  _id : ObjectId('JKS78678923SDFD678'),
  name : "Bob Lawblaw",
  status : "admin",
  options : {
    one : "One",
    two : "Two"
  }
}
下面是我正在使用的查询(我作为我的mongo客户机使用)来尝试更新(或创建)子文档中的值:

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

});
但我无法让它“插入”值

我也发现了类似的问题,但这种方法也不起作用:

提前感谢您的帮助。

解决了这个问题

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

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

});

这将更新所有已存在的字段,如果字段/值对不存在,则创建该字段/值对。

否,这不是重复项。同样的问题,不同的解决方案。你读过这篇文章吗?愚蠢的看门人,没必要粗鲁。解决方案有何根本不同?这与以编程方式构建
$set
对象的方法相同,因为它不起作用。在另一个不同的问题中说明的解决方案会抛出一个错误。我在原来的问题中提到了这一点。当我将
$set
操作符移出
占位符
对象时,我得到了所需的解决方案,效果很好。而且,是的,这里有必要直言不讳。有太多的人在本该花时间仔细阅读问题的时候,却急于通过捐赠他们的看门人服务来获得甜蜜、甜蜜的失败者分数。