2013-10-15 2 views
3

사전 필드 ("UserRegistrations")를 보유하고있는 MongoDB 콜렉션 ("사용자")이 있습니다.

필드 정의는 다음

BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)] 
    public Dictionary<string, UserRegistration> UserRegistrations = new Dictionary<string, UserRegistration>(); 

그것은 키 (문자열)과 값으로 사용자 오브젝트 구성 사전이다.

이것은 MongoDB를 반영하는 방법입니다 : 같은 키가 이미 존재하는 경우

IMongoQuery query = Query.EQ("_id", new ObjectId(uid)); 

var kvp = new KeyValuePair<string, UserRegistration>("517ba4e1696b03108ccef51a", new UserRegistration() 
{ 
RegistrationDate = DateTime.Now.ToUniversalTime(), 
}); 

IMongoUpdate update = Update.AddToSet("UserRegistrations", kvp.ToBsonDocument()); 

collection.Update(query, update, UpdateFlags.Multi); 

그것이 원인이 확인되지 않습니다

"UserRegistrations" : [{ 
    "k" : "517ba4e1696b03108ccef51a", 
    "v" : { 
    "RegistrationDate" : ISODate("2013-07-21T18:57:42.589Z"), 
    "OtherInfo" : "123456test", 
    } 
}], 

나는 다음과 같은 예를 들어, $ AddToSet를 사용하는 경우 사전 필드에서 중복되어 나중에 MongoDB C# 드라이버에서 직렬화 오류가 발생합니다.

동일한 키가 이미 존재하지 않는 것을 어떻게 확인할 수 있습니까?

감사합니다.

답변

0

답변 주셔서 감사합니다. 그러나 이것은 내가 찾고있는 것이 아닙니다.

컬렉션을 다른 "UserRegistrations"컬렉션과 분리하는 것은 나중에 NoSQL 방법론으로 비싼 색인을 필요로합니다. 나는 16 메가 바이트를 필요로하지 않는다. 실제로 이것은 약 1 메가 바이트 정도면 충분하다. 그래서 이것은 나를위한 프로가 아니다.

UID로 데이터에 o (1) 직접 액세스하는 것과 같은 NoSQL이 필요합니다.

내 응용 프로그램에서 문서를 편집하는 두 번째 방법도 나에게 좋지 않습니다.이 메서드는 비동기 적으로 호출 할 수 있습니다. 첫 번째 호출이 현재 문서를 가져오고 두 번째 호출이 가져 오면 그 동안 데이터는 모순 된 결과가있는 경쟁 조건이있을 것입니다.

내가 원했던 것은 MongoDB 솔루션 ($ AddToSet 또는 유사한 한 줄 기능)입니다.

일부 연구가 끝나면 현재이 기능을 구현하는 MongoDB 기능이 없습니다.

어쨌든, 작은 ID를 가진 키가 이미 존재하는지 확인하는 Update 문에 자격을 단순히 추가하여 작은 조작을 사용했습니다.

답 : "RootDocumentKey", "필드 명"과 "DictionaryKey는"당신의 매개 변수입니다

IMongoQuery query = Query.And("_id", new ObjectId("RootDocumentKey")), Query.NE(string.Format("{0}.k", "FieldName"), BsonValue.Create("DictionaryKey"))); 

하는.

MongoDB에서 곧이 기능을 추가 할 수 있기를 바랍니다.

1

스키마의 현재 상태에서 mongodb에 대한 하나의 업데이트 쿼리 만 사용하여 달성하려는 작업을 달성 할 수 없다고 생각합니다.

당신은 키 - 값으로 문서를 업데이트하는

대신 프로그램에 (내가 생각하지 않은 것이 어쩌면 더) 두 가지 옵션

1. 편집 문서가 당신 ,

  • 로컬 C#을 TDocument 객체에 넣어,

    • 쿼리 전체 문서의 데이터베이스에 추가 할
    • 문서의 로컬 복사본에 키 - 값 쌍을 추가하고 이미 존재하는 키를 추가하지 말고
    • Save document 메서드를 사용하여 데이터베이스로 업데이트하십시오.

    이 방법은 (직접 업데이트와 비교할 때) 실제로 속도가 느리지 만 스키마를 변경하지 않고 묻는 것을 수행하는 유일한 방법입니다.

    2. 변경 스키마

    는 각각의 키 - 값 쌍에 대한 (이해의 용이성을 위해 이름 "UserRegistrations")는 분리 수거를하고 (내가 추측하고 그 "UserRegistrations"배열을 포함하는 객체 , UserID 또는 이와 유사한 다른 필드가 있음)는 UserID의 고유 인덱스 복합 인덱스와 키 - 값 쌍의 키를 만듭니다.

    해당 모음의 레코드는 다음과 같이 보일 것이다 :

    { 
        "UserID" : "unique_user_id_of_user_A" 
        "k" : "517ba4e1696b03108ccef51a", 
        "v" : { 
        "RegistrationDate" : ISODate("2013-07-21T18:57:42.589Z"), 
        "OtherInfo" : "123456test", 
        } 
    } 
    { 
        "UserID" : "unique_user_id_of_user_B" 
        "k" : "jkfadifhafo4ho34fo78h34fo7",  #obvious keyboard spazzing here 
        "v" : { 
        "RegistrationDate" : ISODate("2013-07-21T19:57:42.589Z"), 
        "OtherInfo" : "123456test", 
        } 
    } 
    { 
        "UserID" : "unique_user_id_of_user_A"  #same user as first record 
        "k" : "sfahoihu43o43f7437843f8g348",  #different key-value pair 
        "v" : { 
        "RegistrationDate" : ISODate("2013-07-22T18:57:42.589Z"), 
        "OtherInfo" : "123456test", 
        } 
    } 
    

    프로 : 당신은 더 이상 문서 당 16 메가 바이트 제한에 대해 걱정할 필요가없고, 각 사용자는 거의 무제한 "UserRegistrations을"(그들이 할 수 무엇이든 할 수 있습니다).

    단점 : 색인을 사용하여 빠를 수있는 조인을 실행해야하지만 mongodb를 사용할 때는 피하는 것이 좋습니다.

    이것은 내가 생각해 낸 문제에 대한 빠른 해결책입니다. 관심이 있다면 스키마를 구성하는 방법을 연구해야합니다. MongoDb data modelling manualthis question을 시작해야합니다.

    +0

    안녕하세요, 답변 주셔서 감사합니다. 그러나 이것은 내가 찾고있는 것이 아닙니다. 컬렉션을 다른 "UserRegistrations"컬렉션으로 분리하는 것은 나중에 값 비싼 인덱싱을 필요로하는 카운터 NoSQL 방법입니다. 나는 16 메가 바이트를 필요로하지 않는다. 실제로 이것은 약 1 메가 바이트 정도면 충분하다. 그래서 이것은 나를위한 프로가 아니다. 내 응용 프로그램에서 문서를 편집하는 다른 방법은 나에게 좋지 않습니다.이 메서드는 비동기 적으로 호출 할 수 있습니다. 첫 번째 호출이 현재 문서를 가져오고 두 번째 호출도 가져 오면 그 동안 데이터가 충돌합니다. 필요한 것은 MongoDB 솔루션입니다 (AddToSet 또는 유사). – mnnsx

    +0

    +1 감사합니다. – Aaron