3

在我正在进行的一个项目中,有一次我从字符串中读取了对 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?

任何意见,将不胜感激!

4

2 回答 2

0

所以事实证明,放弃那里的 DBObject 工作得很好。它返回一个大小为 0 的游标,真的,但 DBCursor 的长度实际上是我正在寻找的东西。(以前,我一直在检查光标的大小是否为 0,如果是,则返回 null。)

我不太确定 DBCursor 中大小和长度之间的区别是什么(大小和计数之间的区别很明显,但我不确定长度应该是多少),但它现在可以工作了。在上面的例子中,size 和 count 都是 0,但是 length 是期望的数字。

于 2013-06-27T21:00:55.857 回答
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,
“key”:{
“_id”:1
},
“ns”:“test.zips”,
“name”:“ id
},
{
“v” :1,
“key”:{
“pop”:1
},
“ns”:“test.zips”,
“name”:“pop_1”
}
]

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

于 2013-06-27T18:58:05.777 回答