2017-10-12 45 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

的可能的複製[翻譯FilterDefinition 定期JSON蒙戈查詢,我可以在蒙戈shell中運行(HTTPS ://sackoverflow.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