2017-11-15 8 views
0

나는 orders이고 각각은 transactions 임베디드되어 있습니다.Mongodb .net 포함 된 문서 중 하나를 업데이트 중

{ 
    _id: orderId1, 
    other_fields: something else, 
    transactions: [ 
     { 
      _id: someId, 
      price: 25, 
      status: 1 
     }, 
     { 
      _id: someId2, 
      price: 30, 
      status: 0 
     } 
    ] 
} 

이제 트랜잭션 중 하나의 상태를 변경하고 싶습니다 (someId2라고 말하면됩니다). 내가 어떻게 할 수 있니?

모두 주문 및 거래 또한

ICollection<Transaction> 등의 거래와 모델입니다, 어떤 마법 문자열을 사용하지 않고 수 있습니까?

답변

0

이 쿼리의

db.collection.update({"transactions._id":"someId2"}, {$set:{"transactions.$.status":2}}) 

첫 번째 부분은 기록하고, 두 번째 부분은 문서를 업데이트하는 것입니다 찾을 수 있습니다 아래의 쿼리를 사용하여 수행 할 수 있습니다이 업데이트는

있습니다 positional 업데이트입니다 일치하는 하나의 문서에 대해서만 위치 업데이트가 수행됩니다. 쿼리와 일치하는 문서가 여러 개 있어도 하나의 문서 만 업데이트되므로 위치 업데이트를 안전하게 사용하려면 쿼리 일치 부분의 최대 조건을 지정하여 고유 한 일치하는 문서를 검색하십시오.이 경우 수정 된 쿼리는

입니다. - 그것은 본질적으로 C에서 # 번역의 인덱서로 -1의 사용은이 모든 열쇠는

await mongoCollection.UpdateOneAsync(
    o => o.Id == orderId1 && x.Transactions.Any(t => t.Id == someId2), 
    Builders<Order>.Update.Set(x => x.Transactions[-1].Status, someStatus)); 

입니다 : 여기

db.collection.update({"_id":"orderId1", "transactions._id":"someId2"}, {$set:{"transactions.$.status":1}}) 
0

이가 C#을 드라이버를 사용하여 수행 할 수있는 한 가지 방법의 예 Positional Operator. 이 예제에서는 x.Transactions.Any에 대한 호출에서 일치하는 인덱스를 사용하도록 드라이버에 지시합니다. Any을 사용하는 대안이있을 것이라고 확신하지만 고유 한 ID로 검색 중이라면 설정에 사용할 수 있습니다.