2017-01-24 13 views
0

私はstackoverflowを調べましたが、答えは見つかりませんでした。私は重複していない私のローカルmongodbの新しい(空の)配列にObjectを追加しようとしています。私はまた、この配列を他のオブジェクトで更新したいと思っています。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'を追加してください。 'Location:[{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'で前に述べたことを調べて、 'location'配列に重複したバーを追加しないようにします。例えば、

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

それは、あなたは「$ addToSet」を利用することになるんならば、/それ以外の場合は都市名が存在するかどうかを判断するような戦略を使用することを検討してください。そうでなければ、私が使った例のように新しいモデルを利用するでしょう。

関連する問題