插入嵌入式文档

时间:2014-11-27 20:20:48

标签: node.js mongodb mongoose

我有以下架构:

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中是否有任何方法可以将文档更改为嵌入式集合,或者如果不存在则插入新文档?

3 个答案:

答案 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。

希望它有意义。