2017-01-24 63 views
0

我已經看過了stackoverflow,但是我沒有找到答案。我試圖將對象添加到我的本地MongoDB中不是重複的新(空)數組。我也想用其他對象更新這個數組。使用Mongoose.js將對象添加到文檔中的對象數組

我看過$ push和$ addToSet,示例使用的是「id」(_id),直到我添加第一個對象時纔會創建它。

我正在使用Node.js,Mongoose.js,Mongodb,Express.js。

我的模式是:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var barSchema = new Schema({ 
    location: [{ 
      name: String, 
      city: String, 
      total: Number 
       }]  
      }); 
var Bar = mongoose.model('Bar', barSchema); 
module.exports = Bar; 

我試圖用這個;

 var newBar = bar({ 
      location: [{ "name": req.body.bar, "city": req.body.city, "total": 0 }] }); 
      newBar.save(function(err) { 
       if (err) throw err; 
     }); 

我也用了$一推成功,但在這種情況下,我沒有得到一個「ID」

 user.findByIdAndUpdate(req.user._id, { $push: { 
           barlist: { "name": req.body.bar, 
              "rsvp": true } } },   
           function(err, user) { }); 

哪還給這一點;

 { 
     "_id" : ObjectId("######"), 
     "location" : [ 
     { 
      "name" : "1st Bar", 
      "city" : "Boston", 
      "total" : 0, 
      "_id" : ObjectId("#########") 
     } 
       ], 
     "__v" : 0 
     } 
    { 
     "_id" : ObjectId("######"), 
     "location" : [ 
     { 
      "name" : "2nd Bar", 
      "city" : "Boston", 
      "total" : 0, 
      "_id" : ObjectId("#########") 
     } 
       ], 
     "__v" : 0 
     } 

但是我試圖得到這個;

 { 
     "_id" : ObjectId("#######"), 
     "location" : [ 
     { 
      "name" : "Biddy Early's", 
      "city" : "Boston", 
      "total" : 0 
     }, 
     { 
      "name" : "Some Bar Name", 
      "city" : "Boston", 
      "total" : 0 
     } 
        ] 
     } 
+0

如果您不想在位置對象中使用_id,那麼在模式中添加_id:false。 '位置:[{name:String,city:String,total:Number,_id:false}] –

+0

謝謝Tarush我不知道我能做到這一點。然而那不是我所關注的。儘管將來我會記住這一點。我感謝您的幫助。 –

回答

0

請知道可能有更好的方法來做到這一點,但是......你想在這種情況下,要做的第一件事是創建模式或'model'的新實例。根據你的代碼看起來你可能想要考慮這樣的事情;

 var newBar = bar({ 
      "city": req.body.city, 
      location: [{ 
       "bar": req.body.bar, 
       "total": 0 
      }] 
     }); 
     newBar.save(function(err) { 
      if (err) throw err; 
     }); 

,因爲如果你正在尋找在同一個城市酒吧或餐館,你可能會取決於你想要什麼想有一個共同的鍵/值對「.find()」或「.update()」與它做。

從這裏開始,您將需要使用'$ addToSet'來查看您之前提到的內容,以便您不會將重複條添加到「位置」數組中。舉例來說,

 bar.findOneAndUpdate({'city':req.body.city}, 
       {'$addToSet': { location: { 
           'bar': req.body.bar, 'total': 0 } } }, 
         function(err, b) { 
          if (err) throw err; 
           console.log(b); 
          }); 

考慮使用像if/else語句,以確定該城市名稱存在,如果這樣做,那麼你會利用「$ addToSet」的戰略。否則,如果它不存在,您可以像我使用的示例一樣使用新模型。