2013-03-01 6 views
0

У меня есть коллекция Монго DB:MongoDB Неверных результаты

Каждой дата (например, 2013-03-16) может иметь значение 3 страны: IND, США и SA, как показано ниже:

{ 
    "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" 
       } 
      ] 
     } 
    ] 
} 

Я попытался с помощью кода ниже, чтобы проверить структуру:

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); 

Я запрашивая с датой 2013-03-17, но она возвращает данные для 2013-03-16.

Здесь был ответ:

{ 
    "_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" 
       } 
      ] 
     } 
    ] 
} 

Почему возвращаются неправильные данные даты я даю это?

Пожалуйста, смотрите отредактированный часть

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()); 
} 

Тем не менее, я получаю все результаты

{ "_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

Одна вещь, чтобы проверить ... являются даты, сохраненные в формате UTC (пока ваш поиск не?) – WiredPrairie

ответ

3

Ваш запрос разрешается только содержать поле один массив, если вы хотите использовать positional $ operator.

Ваш запрос должен выглядеть вдоль этих линий:

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

Я попытался выше программу, но я был получение исключения в потоке «main» java.lang.StackOverflowError \t at java.util.LinkedHashMap $ LinkedHashIterator. (Неизвестный источник) \t at java.util.LinkedHashMap $ LinkedHashIterator. (Неизвестный источник) \t at java.util.LinkedHashMap $ EntryIterator. (Неизвестный источник) – Pawan

+1

@PreethiJain Замените последний 'subquery.put'' query.put' в вашем коде, чтобы он соответствовал ответу @ nutlike. – JohnnyHK

+0

См. Отредактированную часть в моем вопросе – Pawan

Смежные вопросы