2013-03-01 56 views
0

我有一个蒙戈DB收集:MongoDB的不正确的结果

每个日期(例如2013年3月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年3月17日查询,但它是为2013年3月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 2013-03-01 22:22:38

回答

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。 (Unknown Source) \t at java.util.LinkedHashMap $ LinkedHashIterator。 (Unknown Source) \t at java.util.LinkedHashMap $ EntryIterator。 (Unknown Source) – Pawan 2013-03-02 03:20:57

+1

@PreethiJain将代码中的最后一个'subquery.put'替换为'query.put',以便匹配@ nutlike的答案。 – JohnnyHK 2013-03-02 03:43:28

+0

请参阅我的问题编辑部分 – Pawan 2013-03-02 04:02:55