web-dev-qa-db-fra.com

Comment puis-je vérifier si un champ existe ou non dans MongoDB?

J'ai créé des documents et j'ai réussi à faire des requêtes simples, mais je ne peux pas créer de requête permettant de trouver des documents contenant un champ.

Par exemple, supposons qu'il s'agisse d'un document:

{  "profile_sidebar_border_color" : "D9B17E" , 
   "name" : "???? ???????" , "default_profile" : false , 
   "show_all_inline_media" : true , "otherInfo":["text":"sometext", "value":123]}

Maintenant, je veux une requête qui portera tous les documents où le texte dans otherInfo a quelque chose.

s'il n'y a pas de texte, alors la otherInfo sera juste comme ça: "otherInfo":[]

Je souhaite donc vérifier l’existence du champ text dans otherInfo.

Comment puis-je atteindre cet objectif?

18
jan1

Vous pouvez utiliser l'opérateur $exists en combinaison avec la notation .. La requête nue dans le mongo-shell devrait ressembler à ceci:

db.yourcollection.find({ 'otherInfo.text' : { '$exists' : true }})

Et un cas de test en Java pourrait ressembler à ceci:

    BasicDBObject dbo = new BasicDBObject();
    dbo.put("name", "first");
    collection.insert(dbo);

    dbo.put("_id", null);
    dbo.put("name", "second");
    dbo.put("otherInfo", new BasicDBObject("text", "sometext"));
    collection.insert(dbo);

    DBObject query = new BasicDBObject("otherInfo.text", new BasicDBObject("$exists", true));
    DBCursor result = collection.find(query);
    System.out.println(result.size());
    System.out.println(result.iterator().next());

Sortie:

1
{ "_id" : { "$oid" : "4f809e72764d280cf6ee6099"} , "name" : "second" , "otherInfo" : { "text" : "sometext"}}
53
Matt

La requête in ne filtrerait-elle pas tous les éléments avec la valeur de texte, voir ci-dessous.

db.things.find({otherInfo:{$in: [text]}});

BasicDBObject query = new BasicDBObject();
query.put("otherInfo", new BasicDBObject("$in", "[text]"));
var result = db.find(query);
0

Ou vous pouvez utiliser:

    import static com.mongodb.client.model.Filters.exists;

    Document doc = (Document) mongoCollection.find(exists("otherInfo")).first();
0
Cafta

Vous pouvez utiliser la classe com.mongodb.QueryBuilder pour créer une requête fournie dans la réponse de Matt:

QueryBuilder queryBuilder = QueryBuilder.start("otherInfo.text").exists(true);
DBObject query = queryBuilder.get();
DBCursor dbCursor = collection.find(query);
0
Piyush Khera