【问题标题】:Insert into embedded document插入嵌入文档
【发布时间】:2015-01-26 11:54:13
【问题描述】:

我有以下架构:

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 或插入新文档(如果嵌入式 quizzHistory 中不存在文档)

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    原因是因为您正在使用“查找和更新”,当没有找到该行并创建一个新文档时,您没有处理条件,据说您需要以不同的方式管理,例如

    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");
    })
    

    【讨论】:

    • 嗨@jack.the.ripper 谢谢你的回答,没有条件就没有办法吗?
    • 哪种情况?你能详细说明一下吗?
    • 我会做 user.find 并且如果它返回空数组我使用 $push 否则 $set
    【解决方案2】:

    这对我有用

    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){
            });
      }
    });
    

    【讨论】:

      【解决方案3】:

      如果您想从添加到模型中的所有可能的插件和方法中受益,并且不想与实际的 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 的使用。

      希望它有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2011-03-10
        相关资源
        最近更新 更多