java - Mongo 的 Java 驱动程序,如何构建复杂的查询

标签 java sql mongodb mongodb-query database

我正在针对其中包含一个文档的数据库进行测试。使用以下代码,我从数据库中得到以下结果

BasicDBObject keys = new BasicDBObject();
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", "SH");
keys.put("NumShares", new BasicDBObject("$gte", 0) );

BasicDBObject empty = new BasicDBObject();

DBCursor cursor_02 = coll_tmp.find( empty, keys );
System.out.println( "<2> " + cursor_02.count());
while(cursor_02.hasNext()) {
    System.out.println( "<2>  " + cursor_02.next());
}

这会打印出如下数据

<2>  { <id & oid> , "symbol" : "ESLR" , "Exchange" : "SH"}

该文档还有一个“NumShares”字段,其值设置为 2.34508872。为了尝试 $gt、$gte、$lt、$lte 和 $ne 运算符,我在最后一行“keys.put()”之后添加了一行代码。

keys.put("Price", new BasicDBObject("$gte", 0) );

此代码应继续选择单独的文档,因为它的 NumShares 字段确实大于或等于零。相反,我收到以下错误。

Can't canonicalize query: BadValue Unsupported projection option: NumShares: { $gte: 0 }

最终目标是让 MongoDB 等同于 SQL 查询“SELECT price, symbol, exhange FROM stock WHERE NumShares >= 0, etc...”

我意识到 mkyong doesn't cover this particular query structure in his tutorial ,所以我问大家。谢谢

最佳答案

您想将条件放在查询中,而不是放在要返回的键列表中:

BasicDBObject keys = new BasicDBObject(); // will specify the returned fields (SELECT)
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", 1);

BasicDBObject query = new BasicDBObject(); // will select the documents you want (WHERE)
query.put("numShares", new BasicDBObject("$gte", 0) ); 

DBCursor cursor_02 = coll_tmp.find( query, keys );
System.out.println( "<2> " + cursor_02.count());
while(cursor_02.hasNext()) {
    System.out.println( "<2>  " + cursor_02.next());
}

关于java - Mongo 的 Java 驱动程序,如何构建复杂的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24039423/

相关文章:

node.js - 查询Mongo数据库

node.js - 简单的 Mongoose 唯一验证我做错了什么?

MySQL 连接查询,连接表中只有一条记录,按日期排序

python - 是否有使用Mongodb和Django的明确方法?

java - 逐步抑制 findbugs 警告

java - 尝试从我的 android java 应用程序调用 Web 服务时出现 android.os.NetworkOnMainThreadException 异常?

java - 无法启动新 Activity

java - 无法在未调用的线程上 toast ,RxJava2

c# - 向 SQL 数据库中插入新行

mysql - 该查询仅返回一个结果,应该返回两个