2016-06-16 22 views
7

tôi biết làm thế nào để thêm đối tượng vào bộ sưu tập trong MongoDB sử dụng Node.js, ví dụ:Làm thế nào để thêm đối tượng vào bộ sưu tập trong bộ sưu tập khác trong MongoDB sử dụng Node.js

router.post('/addProduct', function (req, res) { 
    Partner.findByIdAndUpdate({ _id: req.body.partnerId }, { $push: { "products": { name: req.body.dataProduct.name } } }, { safe: true }, function (err, response) { 
     if (err) throw err; 
     res.json(response); 
    }); 
}); 

nhưng những gì nếu trong sản phẩm sẽ bàn khác? Làm cách nào tôi có thể thêm đối tượng vào đó?

Hãy nói rằng đây là sơ đồ của tôi:

var partnerSchema = new mongoose.Schema({ 
    name: String, 
    products: [ 
     { 
      name: String, 
      campaignList: [ 
       { 
        name: String, 
        type: String, 
        startDate: Date, 
        endDate: Date, 
        paymentMethod: String, 
        partnerPayout: Number, 
        ourPayout: Number 
       } 
      ] 
     }] 
}); 

ID trong mỗi partnerproduct là mặc định ._id ví dụ. partner._idproduct._id. Đó là lý do tại sao không có trong lược đồ ở trên. Tuy nhiên tôi gửi chúng từ FrontEnd để phụ trợ như một req.parameter - thường điều nhưng tôi muốn nói nó cho chắc :)

Trả lời

-1

thử điều này:

router.post('/addProduct', function (req, res) { 
     Partner.findOneAndUpdate({ _id: req.body.partnerId }, { $push: { "products": { name: req.body.dataProduct.name, $push: {"campaignList": {name: req.body.name}} } } }, { safe: true }, function (err, response) { 
      if (err) throw err; 
      res.json(response); 
     }); 
    }); 

tôi hy vọng nó sẽ giúp bạn

+0

Mã này sẽ thêm NEW 'product' thay vì thêm' campaignList' vào đã tồn tại – DiPix

0

Trước trận đấu yêu cầu vị trí mảng sản phẩm. Bạn có thể xác nhận điều này bằng cách kiểm tra một phát hiện đơn giản như:

Partner.find({_id: req.body.partnerId), 'products.name': req.body.dataProduct.name }, { 'products.$': 1}) 

Sử dụng $ hành vị trí để đẩy đối tượng mới vào mảng trong các yếu tố sản phẩm phù hợp:

Partner.update({_id: req.body.partnerId), 'products.name': req.body.dataProduct.name }, { $push: { 'products.$.campaignList': { name: 'new campaign' }}}) 

Reference https://docs.mongodb.com/manual/reference/operator/update/positional/

+0

Nó không hoạt động. Tôi nghĩ rằng nó không phải là giải pháp tốt cho mongoose – DiPix

+0

Tôi đã thử nghiệm điều này bên ngoài Mongoose trực tiếp thông qua Robomongo và nó cập nhật như mong đợi. Có lẽ có một số chi tiết khác ngăn việc này hoạt động? Có lẽ có vấn đề với tham chiếu req.body.partnerId hoặc req.body.dataProduct.name? – Paul

1

Đặt cược tốt nhất của bạn sẽ đặt cược để xác định lược đồ & Mô hình cho chiến dịch của riêng nó và thêm nó vào Đối tác bằng cách tham chiếu bằng cách sử dụng _id

var partnerSchema = new mongoose.Schema({ 
    name: String, 
    products: [ 
     { 
      name: String, 
      campaignList: [ 
       { type : mongoose.Schema.Types.ObjectId, ref : 'campaignModel' } 
      ] 
     }] 
}); 
var campaignSchema = new mongoose.Schema({ 
    name: String, 
    type: String, 
    startDate: Date, 
    endDate: Date, 
    paymentMethod: String, 
    partnerPayout: Number, 
    ourPayout: Number 
}); 
var campaignModel = mongoose.model('campaignModel', campaignSchema); 
var partnerModel = mongoose.model('partnerSchema', partnerSchema); 

Thực hành tốt là tìm thời gian bạn đang thử dữ liệu bán phức tạp hoặc đối tượng có nhiều hơn hai hoặc ba khóa và trích xuất chúng vào bộ sưu tập của riêng chúng. Nó không chỉ giúp tìm kiếm các tài liệu đó dễ dàng hơn, mà còn dễ sử dụng chúng hơn khi kết hợp với các đối tượng khác.

Đảm bảo gọi .populate() trong khi truy vấn để MongoDB biết lồng các tài liệu từ các bộ sưu tập khác, nếu không, bạn sẽ chỉ có một mảng là ObjectId.

Các vấn đề liên quan