2013-03-03 3 views
0

Ce sont 3 exemples de fichiers présents dans ma collection d'employés de Mongo DB.MongoDB: Les anciens enregistrements de la collection Mongo DB ne contiennent pas les clés nécessaires

Si vous pouvez observer, il manque un champ nommé "country" dans l'un des enregistrements ci-dessous.

db.employees.find().pretty() 

{ 
     "_id" : ObjectId("513331a227a414395af00904"), 
     "name" : "Ravi", 
     "age" : "21", 
     "dept" : "DEV", 
     "country" : "IND" 
} 


{ 
     "_id" : ObjectId("513331e627a414395af00905"), 
     "name" : "Pavan", 
     "age" : "23", 
     "dept" : "DEV" 
} 

{ 
     "_id" : ObjectId("513331e627a414395af00907"), 
     "name" : "Saagy", 
     "age" : "22", 
     "dept" : "DEV", 
     "country" : "US" 
} 

Je travaille sur un DB existant où Mongo certaines clés ne peuvent pas être présents dans les anciens dossiers de la collection comme indiqué dans les documents ci-dessus.

Actuellement avec le code ci-dessous, je reçois un seul enregistrement comme réponse que la clé de pays n'est pas présent dans un autre enregistrement.

DBCollection mycollection = db.getCollection("employees"); 
    BasicDBObject query = new BasicDBObject(); 
    query.put("dept", "DEV"); 
    query.put("country", "IND"); 

    DBCursor cursor = mycollection.find(query); 

    while (cursor.hasNext()) 
    { 
    System.out.println(cursor.next()); 
    } 

Mon exigence est que, si la clé de pays n'est pas présent, alors il doit être traité comme IND et devrait également être inclus dans la réponse.

Est-ce possible?

Faites-le moi savoir s'il vous plaît.

Mise à jour Partie

J'ai essayé d'utiliser existe $, mais je reçois une exception

public class Test { 

    public static void main(String args[]) throws UnknownHostException { 
     Mongo mongo = new Mongo(); 
     DB db = mongo.getDB("test"); 
     DBCollection mycollection = db.getCollection("employees"); 

     BasicDBObject query = new BasicDBObject(); 
     query.put("dept", "DEV"); 
     query.put("country", "IND"); 
     DBObject subquery = new BasicDBObject("country", new BasicDBObject("$exists", false)); 

     DBCursor cursor = mycollection.find(query,subquery); 

     while (cursor.hasNext()) 
     { 
     System.out.println(cursor.next()); 
     } 




    } 



Exception in thread "main" com.mongodb.MongoException: Unsupported projection option: $exists 
    at com.mongodb.MongoException.parse(MongoException.java:82) 
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:314) 
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295) 
    at com.mongodb.DBCursor._check(DBCursor.java:368) 
    at com.mongodb.DBCursor._hasNext(DBCursor.java:459) 
    at com.mongodb.DBCursor.hasNext(DBCursor.java:484) 
    at com.Test.main(Test.java:26) 
+0

Avez-vous essayé [$ ou] (http://docs.mongodb.org/manual/reference/operator/or/) et [existe] $ (http: // docs .mongodb.org/manual/reference/operator/exists /) pour votre requête? Si vous n'utilisez pas un calque d'objet qui fournit des valeurs par défaut lorsque null, je suggérerais juste d'ajouter la logique à votre code plutôt que de faire le travail occupé de la DB. – WiredPrairie

+0

Merci pour le $ ou et existe existe, je ne parle pas d'eux plus tôt. Je vais essayer et poster si je suis confronté à un problème à ce sujet. – Pawan

+0

Merci, je peux gérer cela avec $ existe m mais en ce moment je reçois une exception, s'il vous plaît voir la partie mise à jour dans ma question. – Pawan

Répondre

1

Vous pouvez résoudre ce problème avec une combinaison de $ ou $ et existe. Cela devrait être de droite:

public class Test { 

public static void main(String args[]) throws UnknownHostException { 
    Mongo mongo = new Mongo(); 
    DB db = mongo.getDB("test"); 
    DBCollection mycollection = db.getCollection("employees"); 

    DBObject clause1 = new BasicDBObject("country", "IND"); 
    DBObject clause2 = new BasicDBObject("$exists", false);  
    BasicDBList or = new BasicDBList(); 
    or.add(clause1); 
    or.add(clause2); 

    BasicDBObject query = new BasicDBObject(); 
    query.put("dept", "DEV"); 
    query.put("$or", or); 

    DBCursor cursor = mycollection.find(query); 

    while (cursor.hasNext()) 
    { 
    System.out.println(cursor.next()); 
    } 




} 
Questions connexes