如何在mongodb中动态设置子文档字段?
我遇到了需要动态更新子文档中字段值的情况。该字段可能存在,也可能不存在。如果它不存在,我希望mongo创建它 下面是一个示例文档,可以在我的如何在mongodb中动态设置子文档字段?,mongodb,mongojs,Mongodb,Mongojs,我遇到了需要动态更新子文档中字段值的情况。该字段可能存在,也可能不存在。如果它不存在,我希望mongo创建它 下面是一个示例文档,可以在我的Teams集合中找到,它用于存储任何给定团队的成员: { _id : ObjectId('JKS78678923SDFD678'), name : "Bob Lawblaw", status : "admin", options : { one : "One", two : "Two" } } 下面是我正在使用的查询(我
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
操作符移出占位符
对象时,我得到了所需的解决方案,效果很好。而且,是的,这里有必要直言不讳。有太多的人在本该花时间仔细阅读问题的时候,却急于通过捐赠他们的看门人服务来获得甜蜜、甜蜜的失败者分数。