2017-03-20 3 views
3

Nous avons une collection contient des documents dans le serveur. Chaque document est comme:Inclure/exclure les champs dans la requête avec le pilote MongoDB C# 2.4

{ _id: "...", Prop1: "", Prop2: "", Prop3: "", LargeField: "", ... } 

Il existe de nombreux autres champs, mais ils ne sont pas requis par le client.

Je veux charger des documents comme MyDoc classe dont la définition est:

public class MyDoc { 
    public string Id { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    public string Prop3 { get; set; } 
    public string LargeField { get; set; } 
} 

J'ai essayé:

var client = new MongoClient(uri); 
var database = client.GetDatabase("MyDatabase"); 
var collection = database.GetCollection<MyDocs>("MyDocs"); 
var allDocs = collection.Find().ToList(); 

Ensuite, il chargera tous les champs pour chaque document, donc je dois mettre [BsonIgnoreExtraElements] sur MyDoc. Le problème ici est que le document est grand mais j'ai seulement besoin d'un sous-ensemble limite de champs. Est-il possible de faire savoir au conducteur que j'ai seulement besoin des champs définis dans la classe?

Si ce n'est pas le cas, est-il possible d'exclure certains des champs tels que LargeField pour réduire le nombre de résultats? J'ai essayé:

var fieldsBuilder = Builders<MyDoc>.Projection; 
var fields = fieldsBuilder.Exclude(d => d.LargeField); 
var allDocs = collection.Find().Project(fields).ToList(); 

Mais maintenant allDocs liste devient BsonDocument au lieu de la liste MyDoc. Comment faire une requête MyDoc avec projection?

Quelqu'un peut-il aider? C'est assez simple dans l'ancien pilote MongoDB mais je ne sais pas comment le faire dans le nouveau pilote. Merci.

Répondre

2

J'ai eu un problème similaire, je crois que vous devez spécifier le type générique, pour une raison quelconque Project suppose automatiquement BsonDocument. Cela devrait le réparer de BsonDocument à votre classe.

Change:

var allDocs = collection.Find().Project(fields).ToList(); 

Pour:

var allDocs = collection.Find<MyDoc>().Project<MyDoc>(fields).ToList(); 

Quant à la façon d'inclure seulement certains domaines, cela peut être fait comme vous le faites avec le constructeur (en utilisant Inclure) ou avec un chaîne sous forme JSON comme:

var allDocs = collection.Find<MyDoc>().Project<MyDoc>("{Prop1: 1, Prop2: 1}").ToList(); 

Je recommande fortement de vérifier la projection sur ce type de p ost: https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-part-3-skip-sort-limit-and-projections-oqfwncyka

De cet article:

Cela nous amène à une autre différence: avec une définition de projection, il convertit implicitement le type de document d'étudiant à BsonDocument, donc ce que nous obtenons est un objet couramment cela, en résultat, sera un BsonDocument (même si ce que nous travaillons est le type Student). Si nous voulons travailler avec Student, nous devons indiquer que nous voulons garder le type à Student.