Catch-all命令在MongoDB中使用正确的模式创建一个字段(如果不存在)

时间:2016-02-21 12:34:06

标签: mongodb

我的用户集合被定义为允许如下所示:

{
    _id: String,
    questions: [Object]
}

questions内,它看起来像这样(例子):

[
    {
        questionId: 'f93uf0auf'
        answer: ["yes", "maybe"]
    },
    {
        questionId: 'avka+0uf'
        answer: ["no"]
    }
]

我试图找到这个集合的全能命令,并涵盖以下基础:

  • 如果questions字段不存在,则应创建该字段。
  • 需要从头开始创建数组,因为这是唯一允许的格式。
  • 应该可以添加到answer集。

我想做这样的事情:

Users.update({_id: userId, 'questions.questionId': questionId}, {$addToSet: {'questions.$.answer': answer}})

但是,如果该字段不存在,则不会创建该字段。 upsert也不起作用。

是否有全能命令?

1 个答案:

答案 0 :(得分:0)

我找不到通过$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);
    });