복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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);
    
  4. from https://stackoverflow.com/questions/31453681/mongo-update-array-element-net-driver-2-0 by cc-by-sa and MIT license