当嵌入式数组对象发生更改时,Mongoose实例.save()无效

时间:2017-11-05 15:58:12

标签: arrays node.js mongodb save

我正在使用Mongoose npm模块来管理mongodb。 这是我将要更新的mongodb集合的模式。

var UserSchema = new Schema({
    username: {
        type: String,
        unique: true,
        required: true
    },
    email: {
        type: String,
        unique: true,
        required: true
    },
    cards: []
});
module.exports = mongoose.model('User', UserSchema);

在post post请求中,这里req是post请求的请求对象。  res是响应对象。

User.findById(userID).exec(function (err, doc) {
        let cardInfo = req.cardInfo
        let cardIndex = req.cardIndex
        doc["cards"][0] = cardInfo;
        console.log(doc)
/*  here I got right doc object as I requested
{
        "_id": "59f3bdd488f912234fcf06ab",
        "email": "test@gmail.com",
        "username": "test",
        "__v": 2,
        "cards": [
            {
                "testNo": "42424242424242"
            }
        ]
    }
*/
        doc.save(function (err) {
          if (err) {
            return res.json({
              success: false,
              msg: 'Card add error'
            });
          }
          res.json({
            success: true,
            msg: 'Successful updated card.'
          });
        });
})

我收到消息'成功更新卡'。但实际上,它没有保存。 如何解决它。感谢。

3 个答案:

答案 0 :(得分:6)

问题是你的阵列的猫鼬没有被修改。

您可以使用2种解决方案:

markModified

This function会将嵌入元素标记为已修改并强制重新保存它。 它会告诉mongoose重新保存这个元素。

User.findById(userID).exec(function (err, doc) {
        let cardInfo = req.cardInfo
        let cardIndex = req.cardIndex
        doc["cards"][0] = cardInfo;
        console.log(doc)
/*  here I got right doc object as I requested
{
        "_id": "59f3bdd488f912234fcf06ab",
        "email": "test@gmail.com",
        "username": "test",
        "__v": 2,
        "cards": [
            {
                "testNo": "42424242424242"
            }
        ]
    }
*/
        doc.markModified('cards');
        doc.save(function (err) {
          if (err) {
            return res.json({
              success: false,
              msg: 'Card add error'
            });
          }
          res.json({
            success: true,
            msg: 'Successful updated card.'
          });
        });
})

使用完整架构。

要避免使用markModified技巧,您应该描述架构中的卡片内容。这样mongoose就可以确定是否需要保存字段。

以下是正确声明架构的方法:

const CardSchema = new Schema({
  testNo: String,
});

var UserSchema = new Schema({
    username: {
        type: String,
        unique: true,
        required: true
    },
    email: {
        type: String,
        unique: true,
        required: true
    },
    cards: [CardSchema]
});
module.exports = mongoose.model('User', UserSchema);

这样,mongoose将能够检测卡内的值是否发生变化并仅保存修改后的项目。

如果你能做到(静态模式),这显然是做到这一点的好方法。

答案 1 :(得分:0)

如果您只想根据cardIndex更新卡片:

User.update({_id: userID}, {'$set': {
    'cards.cardIndex': cardInfo
}}, function(err) {
   //code
}

答案 2 :(得分:0)

感谢所有答案。 我另外找到了这个解决方案。

doc["cards"].set(cardIndex, cardInfo)

干杯!