Catch all命令,用于在MongoDB中创建具有正确架构的字段(如果不存在)
我的用户集合被定义为允许如下所示:Catch all命令,用于在MongoDB中创建具有正确架构的字段(如果不存在),mongodb,Mongodb,我的用户集合被定义为允许如下所示: { _id: String, questions: [Object] } Users.update({_id: userId, 'questions.questionId': questionId}, {$addToSet: {'questions.$.answer': answer}}) 在问题中如下所示(示例): 我试图找到此集合的“全部捕获”命令,并介绍以下基本内容: 如果不存在问题字段,则应创建该字段 需要从头开始创建数组,因为这
{
_id: String,
questions: [Object]
}
Users.update({_id: userId, 'questions.questionId': questionId}, {$addToSet: {'questions.$.answer': answer}})
在问题中
如下所示(示例):
我试图找到此集合的“全部捕获”命令,并介绍以下基本内容:
- 如果不存在
字段,则应创建该字段问题
- 需要从头开始创建数组,因为这是唯一允许的格式
- 应该能够添加到
集合中答案
{
_id: String,
questions: [Object]
}
Users.update({_id: userId, 'questions.questionId': questionId}, {$addToSet: {'questions.$.answer': answer}})
但是,如果字段不存在,则不会创建该字段<代码>向上插入也不起作用
有一个全面的命令吗?我找不到一种方法通过
$addToSet
来满足您的要求,下面是一种通过命令实现的方法
> db.questions
.find({_id: userId})
.forEach(function(doc) {
if (!doc.questions) {
doc['questions'] = []
};
var exist = false;
doc.questions.map(function(e) {
if (e.questionId && (e.questionId == questionId)){
e.answer.push(answer);
exist = true;
}
});
if (!exist) {
doc.questions.push({questionId: questionId, answer: [answer]});
}
db.questions.save(doc);
});
您确定您的查询条件真的在捕获对象吗?当您尝试更新问题对象时,它是否存在 因为我已经测试了你的更新查询,当它不存在时,它会创建答案字段。官方文件也证实了这一点 如果要更新的文档中缺少该字段,$addToSet将创建具有指定值作为其元素的数组字段 它使用这个对象来测试它,成功地将答案字段添加到第二个问题中
{
"_id" : ObjectId("56c9d76e2318c31cb70f9c55"),
"questions" : [
{
"questionId" : "f93uf0auf",
"answer" : [ "yes" ]
},
{
"questionId" : "f93uf0aug"
}
]
}
不,这只会创建一个具有相同
问题ID
和不同答案的新对象。问题
字段,而不是答案
。哦,对了。我不认为你能在一次更新中做到这一点。