[MONGODB] 몽고 업데이트 배열 요소 (.NET 드라이버 2.0)
MONGODB몽고 업데이트 배열 요소 (.NET 드라이버 2.0)
편집하다: 이 일의 자바 스크립트 방법을 찾고 없습니다. 나는이 일의 MongoDB를 C # 2.0 드라이버 방법을 찾고 있어요 (I이 가능하지 않을 수도 있습니다 알고 있지만, 나는 누군가가 해결책을 알고 희망).
내 MongoDB의에서 기본 문서에 배열에 포함 된 항목의 값을 업데이트하려합니다.
나는이 작업을 수행 할 수있는 강력한 형식의 방법을 찾고 있어요. 나는 # 2.0 드라이버 c를 MongoDB를 사용하고
나는 요소를 보여주고 값을 업데이트 한 후 다시 삽입하여 작업을 수행 할 수 있습니다. 이것은 바로 생각하지 않는다; 이후 나는 그 사이에 기록되었을 수 있습니다 무엇을 덮어하고있다.
여기에 내가하지만 행운과 함께 지금까지 시도 것입니다 :
private readonly IMongoCollection<TempAgenda> _collection;
void Main()
{
var collectionName = "Agenda";
var client = new MongoClient("mongodb://localhost:27017");
var db = client.GetDatabase("Test");
_collection = db.GetCollection<TempAgenda>(collectionName);
UpdateItemTitle(1, 1, "hello");
}
public void UpdateItemTitle(string agendaId, string itemId, string title){
var filter = Builders<TempAgenda>.Filter.Eq(x => x.AgendaId, agendaId);
var update = Builders<TempAgenda>.Update.Set(x => x.Items.Single(p => p.Id.Equals(itemId)).Title, title);
var result = _collection.UpdateOneAsync(filter, update).Result;
}
해결법
-
==============================
1.이 (어느 곳이나) 공식 문서의 언급을 한 것으로 나타났습니다하지 않는 한이 알아낼 걸 렸어요. 나는 그러나 C # 2.0 드라이버와 위치 운영자 $를 사용하는 방법을 설명들은 이슈 트래커에이를 발견했다.
이 (어느 곳이나) 공식 문서의 언급을 한 것으로 나타났습니다하지 않는 한이 알아낼 걸 렸어요. 나는 그러나 C # 2.0 드라이버와 위치 운영자 $를 사용하는 방법을 설명들은 이슈 트래커에이를 발견했다.
이것은 당신이 원하는 일을해야한다 :
public void UpdateItemTitle(string agendaId, string itemId, string title){ var filter = Builders<TempAgenda>.Filter.Where(x => x.AgendaId == agendaId && x.Items.Any(i => i.Id == itemId)); var update = Builders<TempAgenda>.Update.Set(x => x.Items[-1].Title, title); var result = _collection.UpdateOneAsync(filter, update).Result; }
당신의 Item.Single () 절은 Item.Any로 변경되었음을 공지 사항 ()와 필터 정의로 이동.
[-1] 또는 .ElementAt (-1) 명백하게 특별히 취급된다 (실제로는 모든 <0)과는 위치 연산자 $로 대체 될 것이다.
위는이 쿼리로 변환됩니다
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })
-
==============================
2.감사합니다,이 도움이되었다. 나는 중첩 된 배열에 밀고 한에서 당겨, 배열의 이상 사용했습니다,하지만 부가 있습니다. 내가 찾은 문제는 그 나는 PullFilter 실제로 작동하지 않는 것을 int 배열 (그래서하지 객체, 단순한 int 배열)가 있다면 - 그것은 단지 배열의로 이상하다 "직렬화 정보를 확인할 수 없습니다를" int 치의. 내가하고 결국은 하나의 INT 매개 변수와 함께 그것을 객체의 배열을 만들고, 그리고 모든 일에 시작했다. 아마도 버그, 또는 이해의 아마 나의 부족. 내가 당겨과 C # 2.0 드라이버를 사용하여 중첩 된 객체 배열에 밀어에 대한 정보를 찾기 위해 싸워 왔어 어쨌든, 나는 그들이 위의 구문을 사용할 때 내가 여기 내 결과를 게시해야한다고 생각.
감사합니다,이 도움이되었다. 나는 중첩 된 배열에 밀고 한에서 당겨, 배열의 이상 사용했습니다,하지만 부가 있습니다. 내가 찾은 문제는 그 나는 PullFilter 실제로 작동하지 않는 것을 int 배열 (그래서하지 객체, 단순한 int 배열)가 있다면 - 그것은 단지 배열의로 이상하다 "직렬화 정보를 확인할 수 없습니다를" int 치의. 내가하고 결국은 하나의 INT 매개 변수와 함께 그것을 객체의 배열을 만들고, 그리고 모든 일에 시작했다. 아마도 버그, 또는 이해의 아마 나의 부족. 내가 당겨과 C # 2.0 드라이버를 사용하여 중첩 된 객체 배열에 밀어에 대한 정보를 찾기 위해 싸워 왔어 어쨌든, 나는 그들이 위의 구문을 사용할 때 내가 여기 내 결과를 게시해야한다고 생각.
var filter = Builders<MessageDto>.Filter.Where(x => x._id == entity.ParentID && x.NestedArray.Any(i => i._id == entity._id)); var update = Builders<MessageDto>.Update.PullFilter(x => x.NestedArray.ElementAt(-1).User, Builders<User>.Filter.Eq(f => f.UserID, userID)); Collection<MessageDto>(currentUser).UpdateOneAsync(filter, update);
그리고 또한:
var filter = Builders<MessageDto>.Filter.Where(x => x._id == entity.ParentID && x.NestedArray.Any(i => i._id == entity._id)); var update = Builders<MessageDto>.Update.Push(x => x.NestedArray.ElementAt(-1).Users, new User { UserID = userID }); Collection<MessageDto>(currentUser).UpdateOneAsync(filter, update);
-
==============================
3.다음과 같은 문서 또는 서브 어레이를 업데이트하는 정확한 방법은 :
다음과 같은 문서 또는 서브 어레이를 업데이트하는 정확한 방법은 :
var filter = Builders<Declaracion>.Filter.Where(x => x.Id == di && x.RemuneracionMensualActual.RemuneracionActIndustrial.Any(s => s.Id == oid)); var update = Builders<Declaracion>.Update.Set(x => x.RemuneracionMensualActual.RemuneracionActIndustrial.ElementAt(-1).Ingreso, datos.ActividadIndustrial.Ingreso) .Set(x => x.RemuneracionMensualActual.RemuneracionActIndustrial.ElementAt(-1).RazonSocial, datos.ActividadIndustrial.RazonSocial) .Set(x => x.RemuneracionMensualActual.RemuneracionActIndustrial.ElementAt(-1).TipoNegocio, datos.ActividadIndustrial.TipoNegocio);
from https://stackoverflow.com/questions/31453681/mongo-update-array-element-net-driver-2-0 by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 중첩 된 문서에 의해 MongoDB를 통합 프레임 워크 일치 (0) | 2019.12.15 |
---|---|
[MONGODB] $ 연산자 존재와 필드의 존재 여부를 검사 할 때 캔 MongoDB를 인덱스를 사용합니까? (0) | 2019.12.15 |
[MONGODB] findOneAndUpdate가 returnNewDocument과 함께 사용했을 때 true를 돌려줍니다 원본 문서 MongoDB를 (0) | 2019.12.14 |
[MONGODB] 어떻게 배열에서 중복 된 항목을 제거하려면? (0) | 2019.12.14 |
[MONGODB] MongoDB의 임베디드 문서에 고유 키 (0) | 2019.12.14 |