2013-04-17 1 views
6

J'essaie d'obtenir le nombre de documents qui ont un champ avec une chaîne vide. Ce champ, appelons-le "Field_One" est présent dans tous les documents (donc, pour être clair, je ne cherche pas à savoir si le champ existe ou non, je veux trouver quels documents n'ont rien (chaîne vide) dans le champ "Field_One »Comment tester qu'un champ de chaîne dans un document MongoDB n'est pas vide?

J'ai essayé d'utiliser (en utilisant le pilote C#).

collection.Find(Query.NE("Field_One", BsonNull.Value)).Count() 
collection.Find(Query.NE("Field_One", BsonString.Null)).Count() 

et même (quelqu'un a suggéré cela quelque part):

collection.Find(Query.GT("Field_One", BsonString.Empty)).Count() 

Mais il ne fonctionne pas (ils reviennent tous les documents)

Aussi, comme une question connexe: Est-ce le meilleur moyen d'obtenir le nombre de documents correspondants dans une collection? Dans la mesure où je comprends cela, il ne récupérera pas réellement les documents de la base de données à mon programme, ainsi le calcul de compte est fait dans le serveur de MongoDB.

+0

nombre de oui est fait sur le serveur. Juste comme une vérification de santé mentale, quand vous dites une chaîne vide, est-ce qu'elle apparaît comme valeur "" lorsque vous récupérez le document et examinez ce champ? –

+0

Bonjour Asya, merci pour votre réponse. J'ai récupéré le JSON et il apparaît comme "" pour les documents qui n'ont pas de données dans ce champ. Donc le champ est là, de type String et a "" pour certains documents, et contient des informations pour d'autres. –

+0

dans mongo shell, vous pouvez essayer: db.collection.find ({field: {$ type: 10}}). Consultez cette documentation: http://docs.mongodb.org/manual/reference/operator/type/ – genericuser

Répondre

6

Afin de tester une chaîne vide n'est pas, en Javascript, il est tout simplement:

collection.find({Field_One:{ $ne: "" }}) 

voir $ne. Je ne peux pas vous aider à traduire cela en langage de pilote C#.

10

BsonNull.Value se traduit nulle
BsonString.Empty se traduit par « »
BsonObject.Create("") se traduit par « » et

collection.Find(Query.NE("Field_One", BsonString.Empty)).Count() 

se traduit "Field_One": { "$ne": "" } ce qui doit être exactement ce que vous cherchez si le champ est en réalité rempli ""

0

En supposant que vous interrogez des documents d'une classe ressemblant à quelque chose comme:

public class MyClass { 
     public string Field_One { get; set; } 
     //... other attributes, constructors, methods etc... 
} 

Vous pouvez également écrire votre requête en utilisant lambdas d'expression comme celui-ci par exemple:

var res = collection.Find(Query<MyClass>.NE(m => m.Field_One, BsonString.Empty)).Count(); 
Questions connexes