2017-10-12 1 views
0

배열을 업데이트하는 코드가 있습니다 (집합에 추가).AddToSetEach 연산자가 올바른 쿼리를 반환하지 않습니다 (Builders v 2.4.4)

var data = new[] { 10, 20, 30 }; 
var fieldName = "data"; 

var oldWay = Update.AddToSetEach(fieldName , new BsonArray(data)); 
Console.WriteLine($"Old way:\n {oldWay.ToJson()} \n\n"); 

이 완벽하게 작동 및 인쇄 : 코드는 현재 기존 빌더를 사용하는 새 빌더 클래스를 사용하려고 할 때

Old way: 
{ "$addToSet" : { "users" : { "$each" : [10, 20, 30] } } } 

을하지만, 나는 제대로 동작하지 않습니다. MongoDB.Driver 2.4.4을 사용하고 있습니다. 내 코드 :

var data = new[] { 10, 20, 30 }; 
var fieldName = "data"; 

var newWay = Builders<BsonDocument>.Update.AddToSetEach(fieldName, new BsonArray(data)).ToJson(); 
Console.WriteLine($"New way:\n {newWay} \n\n"); 

출력은 다음과 같습니다

New way: 
{ "_t" : "AddToSetUpdateDefinition`2" } 

어떤 생각?

감사합니다.

+0

가능한 복제 (HTTPS [나는 몽고 쉘에서 실행할 수있는 일반 json으로 몽고 쿼리에 FilterDefinition 번역] : //stackoverflow.com/questions/32047692/translate-filterdefinitiontdocument-to-regular-json-mongo-query-that-i-can-run) – Veeram

답변

0

.ToJson()은 FilterDefinition에서 원하는대로 문자열을 렌더링한다고 생각하지 않습니다. 이전 드라이버에서는 좀 더 쉽게 사용되었습니다.

Someone

하지만 확장 방법을 썼습니다 : 그런 다음

public static class MongoExtensions 
{ 
    public static BsonDocument RenderToBsonDocument<T>(this UpdateDefinition<T> filter) 
    { 
     var serializerRegistry = BsonSerializer.SerializerRegistry; 
     var documentSerializer = serializerRegistry.GetSerializer<T>(); 
     return filter.Render(documentSerializer, serializerRegistry); 
    } 
} 

을 할 수 있습니다

var data = new[] { 10, 20, 30 }; 
var fieldName = "data"; 

var newWay = Builders<BsonDocument>.Update.AddToSetEach(fieldName, new BsonArray(data)); 

var newWayJson = newWay .RenderToBsonDocument().ToJson(); 

Console.WriteLine($"New way:\n {newWayJson } \n\n"); 
+0

니스, 고마워! 작은 수정 : 확장 메소드는이 경우 UpdateDefinition을 취해야합니다. – amachado

+0

수정 됨, 감사합니다. – bgraham

관련 문제