2013-03-01 5 views
0

J'ai une collection DB Mongo:MongoDB résultats incorrects

Chaque jour (par exemple 16/03/2013) peuvent avoir 3 valeurs de pays: IND, Etats-Unis et SA, comme indiqué ci-dessous:

{ 
    "name": "SAM", 
    "collection": [ 
     { 
      "date": "2013-03-16", 
      "country": "IND", 
      "values": [ 
       { 
        "price": "24.0", 
        "gece": "342.1", 
        "countrycode": "IN" 
       }, 
       { 
        "price": "24.0", 
        "gece": "322.1", 
        "countrycode": "IN" 
       } 
      ] 
     }, 
     { 
      "date": "2013-03-16", 
      "country": "US", 
      "values": [ 
       { 
        "price": "10.0", 
        "gece": "342.1", 
        "countrycode": "US" 
       }, 
       { 
        "price": "120.0", 
        "gece": "342.1", 
        "countrycode": "US" 
       } 
      ] 
     }, 
     { 
      "date": "2013-03-16", 
      "country": "SA", 
      "values": [ 
       { 
        "price": "12.0", 
        "gece": "432.1", 
        "country": "SA" 
       } 
      ] 
     }, 
     { 
      "date": "2013-03-17", 
      "country": "IND", 
      "values": [ 
       { 
        "price": "10.0", 
        "gece": "532.1", 
        "country": "IN" 
       } 
      ] 
     }, 
     { 
      "date": "2013-03-17", 
      "country": "US", 
      "values": [ 
       { 
        "price": "38.0", 
        "gece": "332.1", 
        "country": "US" 
       } 
      ] 
     } 
    ] 
} 
Je

essayé d'utiliser ci-dessous code pour tester la structure:

BasicDBObject query = new BasicDBObject(); 
     query.put("name", "SAM"); 
     query.put("collection.date", "2013-03-17"); 
     query.put("collection.country", "IND"); 
     BasicDBObject fields = new BasicDBObject(); 
     fields.put("name", 1); 
     fields.put("collection.$", 1); 

J'Interrogation avec la date 17/03/2013, mais il est des données de retour pour 16/03/2013.

Voici la réponse était:

{ 
    "_id": { 
     "$oid": "513121ac0651150e227d2224" 
    }, 
    "name": "SAM", 
    "collection": [ 
     { 
      "date": "2013-03-16", 
      "country": "IND", 
      "values": [ 
       { 
        "price": "24.0", 
        "gece": "342.1", 
        "countrycode": "IN" 
       }, 
       { 
        "price": "24.0", 
        "gece": "322.1", 
        "countrycode": "IN" 
       } 
      ] 
     } 
    ] 
} 

Pourquoi est-il renvoyer les données erronées pour la date que je lui donne?

S'il vous plaît voir la partie éditée

Mongo mongo = new Mongo(); 
DB db = mongo.getDB("test"); 
DBCollection mycollection = db.getCollection("xxx"); 


    BasicDBObject query = new BasicDBObject(); 
    query.put("name", "SAM"); 
    query.put("collection.date", "2013-03-16"); 
    query.put("collection.country", "IND"); 
    BasicDBObject fields = new BasicDBObject(); 
    fields.put("name", 1); 
    fields.put("collection.$", 1); 

    BasicDBObject subquery = new BasicDBObject(); 
    subquery.put("date", "2013-03-16"); 
    subquery.put("country", "IND"); 
    query.put("collection", new BasicDBObject("$elemMatch", subquery)); 


DBCursor cursor = mycollection.find(query); 
while (cursor.hasNext()) { 
    System.out.println(cursor.next()); 
} 

encore je reçois tous les résultats

{ "_id" : { "$oid" : "513121ac0651150e227d2224"} , "name" : "SAM" , "collection" : [ { "date" : "2013-03-16" , "country" : "IND" , "values" : [ { "price" : "24.0" , "gece" : "342.1" , "countrycode" : "IN"} , { "price" : "24.0" , "gece" : "322.1" , "countrycode" : "IN"}]} , { "date" : "2013-03-16" , "country" : "US" , "values" : [ { "price" : "10.0" , "gece" : "342.1" , "countrycode" : "US"} , { "price" : "120.0" , "gece" : "342.1" , "countrycode" : "US"}]} , { "date" : "2013-03-16" , "country" : "SA" , "values" : [ { "price" : "12.0" , "gece" : "432.1" , "country" : "SA"}]} , { "date" : "2013-03-17" , "country" : "IND" , "values" : [ { "price" : "10.0" , "gece" : "532.1" , "country" : "IN"}]} , { "date" : "2013-03-17" , "country" : "US" , "values" : [ { "price" : "38.0" , "gece" : "332.1" , "country" : "US"}]}]} 
+1

Une chose à vérifier ... sont les dates enregistrées comme UTC (encore votre recherche n'est pas?) – WiredPrairie

Répondre

3

Votre requête est autorisé à contenir un champ tableau si vous souhaitez utiliser le positional $ operator.

Votre requête devrait ressembler à quelque chose le long de ces lignes:

BasicDBObject subquery = new BasicDBObject(); 
subquery.put("date", "2013-03-17"); 
subquery.put("country", "IND"); 
query.put("collection", new BasicDBObject("$elemMatch", subquery)); 
+0

J'ai essayé le programme ci-dessus, mais je get Exception dans le fil "principal" java.lang.StackOverflowError \t at java.util.LinkedHashMap $ LinkedHashIterator. (source inconnue) \t at java.util.LinkedHashMap $ LinkedHashIterator. (source inconnue) \t at java.util.LinkedHashMap $ EntryIterator. (Source inconnue) – Pawan

+1

@PreethiJain Remplacez le dernier 'subquery.put' par' query.put' dans votre code afin qu'il corresponde à la réponse de @ nutlike. – JohnnyHK

+0

Veuillez voir la partie éditée dans ma question – Pawan

Questions connexes