Mongo에서 upsert 작업을 수행하려고 할 때 Object ID 대신 ID에 대한 GUID를 생성해야합니다. 이 경우 특정 속성을 가진 객체가 아직 존재하지 않고 업데이트가 발생하면 실제로 예외를 던지는 지 확인합니다. OBJECTID으로 ID를 생성합니다 이런 식으로 이렇게MongoDB C# Upsert with Guid
// query to see if there are any pending operations
var keyMatchQuery = Query<Event>.In(r => r.Key, keyList);
var statusMatchQuery = Query<Event>.EQ(r => r.Status, "pending");
var query = Query.And(keyMatchQuery , statusMatchQuery);
var updateQuery = new UpdateBuilder();
var bson = request.ToBsonDocument();
foreach (var item in bson)
{
updateQuery.SetOnInsert(item.Name, item.Value);
}
var fields = Fields<Request>.Include(req => req.Id);
var args = new FindAndModifyArgs()
{
Fields = fields,
Query = query,
Update = updateQuery,
Upsert = true,
VersionReturned = FindAndModifyDocumentVersion.Modified
};
// Perform the upsert
var result = Collection.FindAndModify(args);
보다는 우리가 upsert 작업을 수행하는 방법을
public class Event
{
[BsonId(IdGenerator = typeof(GuidGenerator))]
[BsonRepresentation(BsonType.String)]
[BsonIgnoreIfDefault]
public Guid Id { get; set; }
// ... more properties and junk
}
그리고 여기에 있습니다 : 여기
는 클래스 정의의 스텁입니다 GUID 는 는 확실히 먼저 .FindOne를 수행하여 내가 두 단계 작업으로 원하는 동작을 얻고, 실패하면, 직접 삽입하고 있습니다:이 경우
var existingItem = Collection.FindOneAs<Event>(query);
if (existingItem != null)
{
throw new PendingException(string.Format("Event already pending: id={0}", existingItem.Id));
}
var result = Collection.Insert(mongoRequest);
을 올바르게 GUID를 설정 새 항목의 경우 연산이 비 원자력입니다. 나는 드라이버 레벨에서 기본 ID 생성 메커니즘을 설정하는 방법을 검색하고,이 그것을 할 것이라고 생각 :
BsonSerializer.RegisterIdGenerator(typeof(Guid), GuidGenerator.Instance);
...하지만 아무 소용이, 나는 그 때문에 upsert을위한 가정 해 ID 필드를 포함 할 수 없으므로 직렬화가 일어나지 않으며 Mongo가 모든 작업을 수행합니다. 또한 컨벤션을 구현하는 방법을 살펴 보았지만이를 처리 할 별도의 생성 메커니즘이 있으므로 의미가 없습니다. 이 방법을 찾고 있거나 뭔가를 놓친 다른 접근법이 있습니까?
GUID가 Mongo에서 항상 이상적은 아니라는 것을 알고 있지만 다른 시스템과의 호환성 때문에 사용하고 있습니다.
여기에 포함 된 링크는 제공되는 정보와 함께 내 질문에 대한 답변을 제공했습니다. 설명 된 시나리오는 우리가 실행 한 것과 정확히 일치합니다. 우리는 Mongo의 어떤 버전을 설치했는지, 업그레이드 할 수 있는지 찾고 있습니다. 왜냐하면 현재 우리는 몇 가지 버전을 가지고 있기 때문입니다. – Masaka