Mongoose在子对象中创建子对象

时间:2016-10-12 06:56:59

标签: node.js mongodb mongoose

我想在子对象字段中创建一个子文档,而不是更新。

我的架构:

var DemandeSchema = new Schema({
    titre: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    type: {
        type: String,
        required: true
    },
    answer: {}
});

我的代码:

demande.update(
    { name: 'answer' },
    { $push: req.body.answer },
    { upsert: true }, 
    function(error, user) {
        if (error) return next(error);
        else {
            return true;
        }
    }
)

req.body.answer = {
  "id": "57f512f4360d8818a4e5ea3d",
  "answer": {
     "122547eee99" : {
        "review" : "1.3",
        "login" : "new"
    }
  }
}

但是这段代码不会在我的数据库中创建一个新字段,它只是在我想在答案字段中创建一个新的对象字段时更新字段answer

实际结果

{
    "_id" : ObjectId("57f512f4360d8818a4e5ea3d"),
    "titre" : "TEST",
    "description" : "ee",
    "type" : "ee",
    "__v" : 0,
    "answer" : {
        "122547eee98" : {
            "review" : "8.8",
            "login" : "x"
        }
    }
}

预期结果

{
    "_id" : ObjectId("57f512f4360d8818a4e5ea3d"),
    "titre" : "TEST",
    "description" : "ee",
    "type" : "ee",
    "__v" : 0,
    "answer" : {
        "122547eee98" : {
            "review" : "8.8",
            "login" : "x"
        },
        "122547eee99" : {
            "review" : "1.3",
            "login" : "new"
        }
    }
}

3 个答案:

答案 0 :(得分:1)

var DemandeSchema = new Schema({
titre: {
    type: String,
    required: true
},
description: {
    type: String,
    required: true
},
type: {
    type: String,
    required: true
},
answer: []
});

答案字段花括号会转换为方括号以推送所有新答案。 结论:它创建了一个数组。

答案 1 :(得分:1)

不使用适用于数组的 $push 运算符,而是使用 $set 运算符和点符号set the subdocument in the embedded answer document

您需要预处理要在更新中使用的文档,以便它具有 dot notation 。以下mongo shell示例演示了这一点:

var description = [
  "http://placehold.it/300x300",
  "http://placehold.it/200x200",
  "http://placehold.it/100x100"
];

var size = description.length

$('.item img').each(function(i,e) {
   var x = Math.floor(Math.random() * size)
    if($(this).hasClass("people")) {
        $(this).attr("src",description[x]);
    }
});

使用与上述相同的概念,您可以创建要在更新中使用的文档,如下所示:

var obj = {
        "id": "57f512f4360d8818a4e5ea3d",
        "answer": {
            "122547eee99" : {
                "review" : "1.3",
                "login" : "new"
            }
        }
    },
    update = {};
var key = Object.keys(obj.answer)[0]; // get the dynamic key "122547eee99"
update["answer."+key] = obj.answer[key]; // create the update object with dot notation

/*
    update = {
        "answer.122547eee99": {
            "review" : "1.3",
            "login" : "new"
        }
    }
*/

db.demandes.update(
    { "_id" : ObjectId(obj.id)},
    { "$set": update },
    { "upsert": true }
)

答案 2 :(得分:0)

试试这个,并在模式中回答:[],

 demande.findOne( { name: 'answer' }, function(err, result){
 result.answer.push({ans:req.body.answer})
 var dem = new Demande(result); // Demande is ur mongoose schema model, 
 dem.save(function(err, result){

 console.log(result);
});
})