使用java中的运算符将字符串解析为mongodb查询文档

时间:2013-06-26 17:31:51

标签: java json mongodb

在我正在进行的项目中,我一度从字符串中读取了对mongodb的查询。我一直在使用com.mongodb.util.JSON.parse(querystring)来读取查询,该工作正常,直到我开始阅读包含$ max和$ min等运算符的查询。此时,解析器不是使用mongodb的$ max运算符,而是创建一个“$ max”字段。例如,

输入字符串:

{ $query : { state : "AL" } , $max : { pop : 9058 } }

被解析为DBObject:

{ "$query" : { "state" : "AL"} , "$max" : { "pop" : 9058}}

当我查找带有该查询文档的DBCursor时,我得到一个大小为0的光标(在数据库中找不到匹配的文档),可能是因为没有带有“$ query”或“$ max”字段的文档。

除了JSON.parse()之外,还有什么我可以使用的吗?我不反对为它编写自己的函数,但是如何获得一个将$运算符识别为运算符而不是字段的DBObject?

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:0)

以下使用查询修改运算符$ max的代码段似乎工作正常。

/* {$query:{state:"AL"}, "$max":{pop:10000}}*/
String s = "{$query:{state:\"AL\"}, \"$max\":{pop:10000}}";
DBObject dbObject = (DBObject) JSON.parse(s);
System.out.println("\nFind all: ");

DBCursor cursor = collection.find(dbObject);

try {
    while (cursor.hasNext()) {
        DBObject cur = cursor.next();
        System.out.println(cur);
    }
} finally {
   cursor.close();
}

确保您在pop上指定了索引。

  

db.zips.getIndexes()
  [
      {
           “v”:1,
           “关键”:{
                   “_id”:1            },
          “ns”:“test.zips”,
          “name”:“ id
      },
      {
          “v”:1,
          “关键”:{
              “pop”:1           },
          “ns”:“test.zips”,
          “名字”:“pop_1”
      }
  ]

有关详细信息,请参阅以下链接 http://docs.mongodb.org/manual/reference/operator/max/
如果您对使用聚合运算符$ max或$ min感兴趣,以下链接提供详细信息和示例代码 http://docs.mongodb.org/ecosystem/tutorial/use-aggregation-framework-with-java-driver/

答案 1 :(得分:0)

所以事实证明DBObject在那里得到了很好的解决方案。它返回一个大小为0的游标,为true,但DBCursor的长度实际上是我正在寻找的东西。 (以前,我一直在检查游标的大小是否为0,如果是,则返回null。)

我不太确定DBCursor中大小和长度之间的区别是什么(大小和计数之间的差异很明显,但我不确定应该是多长),但它现在可以正常工作。在上面的情况中,大小和计数都是0,但长度是所需的数字。