我遇到过需要动态更新子文档中字段值的情况。该字段可能已存在,也可能尚未存在。如果它不存在,我想让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
提前感谢您的帮助。
答案 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);
});
这将更新已存在的任何字段,并创建字段/值对(如果尚不存在)。