插入到embedded的文档

我有以下架构:

var UserSchema = new Schema({ username: { type: String, required: true }, password: { type: String, required: true }, userType: { type: String, default: 'user'}, quizzHistory: [{ quizzName: String, quizzScore: Number }] }); 

我的目标是将文档转换为embedded式quizzHistory,或者在embedded式quizzeHistory中不存在文档时插入新文档

我尝试将文档设置为embeddedquizzHistory:

 User.findOneAndUpdate({ _id: req.session.user['_id'], 'quizzHistory.quizzName': testName}, { '$set': { 'quizzHistory.$.quizzName': testName, 'quizzHistory.$.quizzScore': finalScore } }, {upsert: true}, function(err, upd) { console.log("added"); }) 

如果quizzHistory中包含需要_id和quizzHistory.quizzName的文档,则上面的代码工作,但如果没有任何文档,则不要推送新文档。

有什么办法在Mongodb中将文档更改为embedded式集合或插入新文件(如果不存在)?

这对我工作

 User.update({ _id: req.session.user['_id'],'quizzHistory.quizzName':testName}, { $set: { "quizzHistory.$.quizzName":testName, "quizzHistory.$.quizzScore":finalScore } }, function(err, upd) { if(!upd){ User.update({ _id: req.session.user['_id']}, { "$addToSet": { quizzHistory: newScoreData }},function(err,data){ }); } }); 

原因是因为你正在使用“查找和更新”你没有处理条件,当行没有被发现,并创build一个新的文件,说你需要pipe理的方式不同

 User.update({ _id: req.session.user['_id'], 'quizzHistory.quizzName': testName}, { '$push': { 'quizzHistory.quizzName': testName, 'quizzHistory.quizzScore': finalScore } }, {upsert: true}, function(err, upd) { console.log("added"); }) 

如果你想为所有可能的插件和方法添加模型,而不想与实际的Mongo查询作斗争,你应该首先检索用户对象,然后将新元素推到quizzHistory数组并保存。 像下面的东西(你需要alignment你的需要)。

 var entry = { quizzName : 'abc', quizzScore : 123 }; User.findOne({_id:id, function(err, object) { if(err) { return someErrorCallback(); } var object.quizzHistory.push(entry); object.save(function(err) { if(err) { return someErrorCallback(); } someSuccessCallback(); }); }); 

直接更新可能是有效的,但问题使用mongoose。

希望这是有道理的。