MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Phiên bản Mongoose .save () không hoạt động khi đối tượng mảng nhúng thay đổi

Vấn đề là mongoose không biết mảng của bạn bị sửa đổi.

Bạn có thể sử dụng 2 giải pháp:

markModified

Chức năng này sẽ đánh dấu phần tử nhúng là đã sửa đổi và buộc lưu lại phần tử đó. Nó sẽ yêu cầu mongoose lưu lại phần tử này.

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": "[email protected]",
        "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.'
          });
        });
})

Sử dụng một lược đồ đầy đủ.

Để tránh thủ thuật markModified, bạn nên mô tả nội dung của các thẻ trong lược đồ của mình. Bằng cách này, mongoose sẽ có thể xác định xem nó có cần lưu trường hay không.

Đây là cách để khai báo lược đồ của bạn đúng cách:

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

Bằng cách này, mongoose sẽ có thể phát hiện xem giá trị bên trong thẻ có thay đổi hay không và chỉ lưu mục đã sửa đổi.

Nếu bạn có thể làm điều đó (lược đồ tĩnh), đây rõ ràng là cách tốt để làm điều đó.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. FindIterable <Document> có tải tất cả tài liệu không?

  2. Tối ưu hóa truy vấn MongoDB

  3. Mongoose có cho phép nhiều yêu cầu cơ sở dữ liệu đồng thời không?

  4. Chạy MongoDB 4.2 được sao chép trong Kubernetes:không nhận được cấu hình replset

  5. brew install php56-mongo Lệnh Không hoạt động