MongoDB에서 문서의 하위 배열에있는 자식 요소를 수정하는 방법은 무엇입니까? MongoDB (C# 드라이버 버전 : 2.5, 서버 버전 : 3.2.0)에 대한 최신 C# 드라이버를 사용하고 있으며 SO (중복 질문도 포함) 및 기타 여러 답변에서 여러 가지 해결책을 시도했습니다. 출처. 대부분의 솔루션은 쓸모없는 것으로 판명되었습니다. 다음은 C# 드라이버를 사용하여 MongoDB Array에서 하위 문서를 업데이트하는 방법
내 샘플 문서입니다 : 루트 문서는이 하위 내부 메타 데이터 및 페이지 목록 (배열)의이 하위 문서의 배열을 포함 : 문서 구조가
[{
"_id" : "69c4f77d-05ef-431d-ae17-c076c6173e04",
"title" : "Root Page",
"createdAt" : ISODate("2017-12-21T12:28:00.680+0000"),
"modifiedAt" : ISODate("2017-12-26T07:18:11.165+0000"),
"pages" : [
{
"_id" : "f449dc0b-3d1b-4a59-b622-6a42ce10b147",
"title" : "Test page 1",
"slug" : "test-page-1",
"createdAt" : ISODate("2017-12-21T12:28:00.680+0000"),
"modifiedAt" : ISODate("2017-12-21T12:28:00.680+0000")
},
{
"_id" : "3d1497d7-f74c-4d88-b15c-bf2f9c736374",
"title" : "Test page 2",
"slug" : "test-page-2",
"createdAt" : ISODate("2017-12-25T11:27:55.006+0000"),
"modifiedAt" : ISODate("2017-12-25T11:27:55.006+0000")
},
{
"_id" : "6e827e2a-5a25-4343-b646-885816bb8cc4",
"title" : "Test page 3",
"slug" : "test-page-3",
"createdAt" : ISODate("2017-12-25T11:31:16.516+0000"),
"modifiedAt" : ISODate("2017-12-25T11:31:16.516+0000")
}]
},
...,
...
]
문서 -
제목 및
슬러그
자식 페이지 개체를
페이지 배열로 업데이트하려고합니다. 최신 드라이버로는 지금까지 행운이 없습니다. 이제
var filter = Builders<SubDocument>.Filter.And(Builders<SubDocument>.Filter.Eq("_id", "xxx"), Builders<SubDocument>.Filter.ElemMatch(x => x.Pages, p => p.Id == "xxx"));
var update = Builders<SubDocument>.Update
.Set("pages.$.title", "changed title")
.Set("pages.$.slug", "changed-title")
.Set("pages.$.modifiedAt", DateTime.UtcNow);
_mongoDb.Documents.UpdateOne(filter, update);
-이 쿼리 나에게 오류 반환 :
나는 다음과 같은 필터 및 업데이트 쿼리를 사용하고
Invalid BSON field name pages.$.title
나는 지난 몇 시간 동안 함께 온 참조가 말을 "$"연산자를 사용하지만 최신 드라이버에 오류가 발생합니다.
public class SubDocument
{
public SubDocument()
{
Id = Guid.NewGuid().ToString();
CreatedAt = DateTime.UtcNow;
ModifiedAt = DateTime.UtcNow;
Pages = new List<Page>();
}
[BsonId]
public string Id { get; set; }
[BsonElement("title")]
public string Title { get; set; }
[BsonElement("createdAt")]
public DateTime CreatedAt { get; set; }
[BsonElement("modifiedAt")]
public DateTime ModifiedAt { get; set; }
[BsonElement("pages")]
public List<Page> Pages { get; set; }
}
public class Page
{
[BsonId]
public string Id { get; set; }
[BsonElement("title")]
public string Title { get; set; }
[BsonElement("slug")]
public string Slug { get; set; }
[BsonElement("createdAt")]
public DateTime CreatedAt { get; set; }
[BsonElement("modifiedAt")]
public DateTime ModifiedAt { get; set; }
}
사람 :
[편집 1]은 여기 내 모델인가? 미리 감사드립니다!
업데이트해야 할 요소와 값은 무엇입니까? 아니면 모든 페이지? 필터가 있으십니까? – Evk
안녕하세요, @Evk, PS, 감사합니다. –
SubDocument의 모델도 포함 할 수 있습니까? 그냥 하나 붙여 넣기 복사 할 수 있습니다 – Evk