2017-05-21 4 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; } 
     } 

삽입 방법 당신은 $positional 연산자를 사용해야

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

.

당신은 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