2017-05-21 3 views
1

MongoDBのUsersというコレクションに次のようなdocumentがあります。私はmycellarcellarbeersInCellar[]<SpecificBeer>を挿入しようとしています。私はfilterupdateオブジェクトですべての種類の組み合わせを試しましたが、ネストされた配列に挿入することで頭を包むことはできません。私はfinddocumentの方法を知っていて、その文書の配列には挿入しないでください。C#MongoDBのネスト配列に挿入

{ 
    "_id" : ObjectId("5920751b6d4f6a27cf7985a8"), 
    "name" : "FullName", 
    "emailAddress" : "[email protected]", 
    "cellars" : [ 
     { 
      "cellarId" : "mycellar", 
      "cellarName" : "My Cellar", 
      "beersInCellar" : [ ] 
     } 
    ] 
} 

SpecificBeerモデル:

public class SpecificBeer 
     { 
      public string ourid 
      { 
       get 
       { 
        return ID.ToString(); 
       } 
       set 
       { 
        ID = ObjectId.Parse(value); 
       } 
      } 
      [BsonId] 
      private ObjectId ID {get; set;} 
      public string year { get; set; } 
      public string variant { get; set; } 
      public string quantity { get; set; } 
      public string numberForTrade { get; set; } 
     } 

Insertメソッド

public async Task<SpecificBeer> AddBeerToList(string id, SpecificBeer specificBeer, string cellarId) 
{ 
     var filter = Builders<User>.Filter.Eq(e => e.userId, id) & Builders<User>.Filter.Eq(e => e.cellars, cellarId); 

     var update = Builders<Cellar>.Update.Push<SpecificBeer>(e => e.beersInCellar, specificBeer); 

     await _collection.FindOneAndUpdateAsync(filter, update); 
     return specificBeer; 
} 

答えて

1

あなたは$positional演算子を使用する必要があります。

あなたはMongoDBのは、要素のインデックスを検索し、beersInCellarに要素をプッシュする更新部にクエリー部分から見つかったインデックスを持つプレースホルダ($)を交換するためにcellarsからフィールド(cellarId)を含むようにしました。

参照用

var filter = Builders<User>.Filter.Eq(e => e.name, "FullName") & Builders<User>.Filter.ElemMatch(e => e.cellars, Builders<Cellar>.Filter.Eq(e => e.cellarId, "mycellar")); 
var update = Builders<User>.Update.Push(e => e.cellars[-1].beersInCellar, specificBeer); 

シェルクエリのような何か:

db.collection.update({"name" : "FullName", "cellars":{$elemMatch:{"cellarId":"mycellar"}}},{$push:{"cellars.$.beersInCellar":{"quantity":1, "year":1986}}}) 

MongoDBは配列内のネスト配列に(例えばquantity用)フィールドを更新するための最初のクラスをサポートしていません。

複数レベルの更新を許可するjiraを追跡できます。

https://jira.mongodb.org/browse/SERVER-27089

あなたは今のあなたの構造を再検討することをお勧めします。 beersInCellarアレイをトップレベルに昇格させてください。

+0

これは数多くの情報でした。ありがとうございました!私はおそらく私のスキーマを考え直すでしょう。 – Jrow

関連する問題