web-dev-qa-db-fra.com

Traduire FilterDefinition <TDocument> en requête json mongo régulière que je peux exécuter dans un shell mongo

J'ai de nombreuses requêtes complexes que je souhaite parfois vérifier directement contre Mongo à des fins de débogage\explaining (). Avec le nouveau pilote c # 2.0+, je ne sais pas comment procéder. Avec la version précédente, il y avait une chose appelée IMongoQuery et This fonctionnait.

Un exemple simple:

FilterDefinition<LalalaEvent> filter = Builders<LalalaEvent>.Filter
    .Where(e => ids.Contains(e.Id) && e.Deleted != true );
17
Shy Peleg

Si vous utilisez la dernière version du pilote, qui est 2.0.1, vous pouvez facilement mettre ce filtre dans une opération Find, récupérer un IFindFluent et imprimer son ToString:

var filter = Builders<LalalaEvent>.Filter.Where(e => ids.Contains(e.Id) && e.Deleted != true);
var findFluent = collection.Find(filter);
Console.WriteLine(findFluent);

Par exemple pour moi, cela imprime:

find({ "_id" : { "$in" : [1, 2, 3] }, "Deleted" : { "$ne" : true } })
18
i3arnon

J'essayais de résoudre le même problème aujourd'hui. Voici ce que j'ai trouvé.

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

Je n'avais pas accès à une collection quand je l'appelais, donc je ne pouvais pas utiliser les solutions ci-dessus.

Cela vous permet de faire

var json = filter.RenderToBsonDocument().ToJson();
35
zrbecker

Vous pouvez effectuer cela en utilisant les propriétés de la collection:

var result = filter.Render(collection.DocumentSerializer,
                           collection.Settings.SerializerRegistry).ToString();
16
Vladislav Furdak