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
和不同答案的新对象。
问题
字段,而不是
答案
。哦,对了。我不认为你能在一次更新中做到这一点。