我有以下架构:
var UserSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
userType: { type: String, default: 'user'},
quizzHistory: [{
quizzName: String,
quizzScore: Number
}]
});
我的目标是将文档更改为嵌入式quizzHistory,或者在嵌入式quizzeHistory中插入新文件(如果不存在)
我尝试将文档设置为嵌入式quizzHistory:
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中是否有任何方法可以将文档更改为嵌入式集合,或者如果不存在则插入新文档?
答案 0 :(得分:2)
原因是因为你正在使用“查找和更新”,你没有在找不到行时处理条件并创建一个新文档,据说你需要以不同的方式管理
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");
})
答案 1 :(得分:1)
这对我有用
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){
});
}
});
答案 2 :(得分:1)
如果您希望为添加到模型中的所有可能的插件和方法带来好处,并且不想与实际的Mongo查询对抗,则应首先检索用户对象,然后将新元素推送到quizzHistory数组并进行保存。如下所示(您需要根据需要调整代码)。
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。
希望它有意义。