概述
在MongoDB中,你可以用查询 find 方法来从一个集合中查询数据。MongoDB的所有查询都是单个集合范围内。
查询能返回集合中的所有文档,或者是最符合条件的文档。你可以用
org.bson.Document里的find方法,传入参数查询。
该 find方法用FindIterable(生成文档的迭代对象)来返回一个查询结果。
预备条件
该例子仍然使用test数据库中的restaurant集合。关于导入数据集的相关操作,请看之前的博文。
紧跟着之前的操作,从连接数据库,到运行MongoDB,到创建test数据库和restaurant集合。
我们需要导入以下的包:
import org.bson.Document;
import com.mongodb.Block;
import com.mongodb.client.FindIterable;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Sorts.ascending;
import static java.util.Arrays.asList;
在一个集合中查询所有的文档
为了查询出所有的文档,我们在find方法中不需要传入任何条件。例如,以下的操作就能返回restaurant集合中的所有文档:
FindIterable<Document> iterable = db.getCollection("restaurants").find();
迭代结果集,并用块(block)运用到每个文档:
iterable.forEach(new Block<Document>() {
@Override public void apply(final Document document) {
System.out.println(document); }
});
该结果集包含了restaurant里的所有文档。
指定平等条件
用MongoDB提供的Java驱动包来实现平等条件查询,例如:
new Document( <field>, <value> )
如果<field>是一个内嵌的文档或者数组,用.点符号来访问。
为了定制查询条件,MongoDB的Java驱动包提供了 Filter类。该类包含各种静态方法来简化查询操作,例如下面的 eq方法:
eq(<field>, <value>)
通过顶级域查询
以下操作查询 borough为 “Manhattan”的文档。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("borough", "Manhattan"));
迭代结果集,并用块(block)运用到每个文档:
iterable.forEach(new Block<Document>() {
@Override public void apply(final Document document) {
System.out.println(document); }
});
利用 Filter类提供的静态方法,你还可以这么做:
db.getCollection("restaurants").find(eq("borough", "Manhattan"));
用嵌入式文档查询字段
为了在带有嵌入式文档的域中明确查询条件,我们使用点记法。点记法需要传入整个全限定名,以下操作指定查询在address域里的zipcode嵌入文档。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("address.zipcode", "10075"));
迭代结果集:
iterable.forEach(new Block<Document>() {
@Override public void apply(final Document document) {
System.out.println(document);
}});
或者用Filter类的静态方法,还可以这么做:
db.getCollection("restaurants").find(eq("address.zipcode", "10075"));
更多关于带有嵌入文档的查询,请看Embedded Documents
数组中的域查询
grade数组包括很多嵌入的文档。要明确查询条件,我们用点记法。
点记法仍然需要我们传入整个全限定名,以下操作是获得grade为B的结果集。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("grades.grade", "B"));
迭代结果:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter类提供的静态方法,
db.getCollection("restaurants").find(eq("grades.grade", "B"));
更多关于数组的查询,请看Arrays
明确条件的操作
MongoDB提供明确条件的查询,例如比较操作Comparison Query Operators,尽管还有一些比如or和and操作,这些操作的大致都有以下格式:
new Document( <field>, new Document( <operator>, <value> ) )
为了明确查询条件,MongoDB的Java驱动包提供了Filter类提供很多静态方法建立查询,其中包括lt(less than)和gt(greater than)等:
lt(<field>, <value>)
gt(<field>, <value>)
gt的操作:
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("grades.score", new Document("$gt", 30)));
然后迭代结果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter类提供的静态方法:
db.getCollection("restaurants").find(gt("grades.score", 30));
lt的操作
我们查询出grade里score小于10的结果集:
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("grades.score", new Document("$lt", 10)));
迭代出结果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter类提供的静态方法:
db.getCollection("restaurants").find(lt("grades.score", 10));
联合查询
你可以用逻辑连接词 and或者 or来构建联合查询。
逻辑词 and
你可以用逻辑词 and 来构建多条件查询语句。更多操作请看org.Bson.Document类。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document(
"cuisine", "Italian").append("address.zipcode", "10075"));
迭代出结果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter类提供的静态方法:
db.getCollection("restaurants").find(and(
eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
逻辑连接词or
你可以用逻辑连接词or来构建查询:
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("$or", asList(new Document(
"cuisine", "Italian"),
new Document("address.zipcode", "10075"))));
然后迭代出结果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter类提供的静态方法:
db.getCollection("restaurants").find(
or(eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
给结果集排序
给结果集排序,我们用 sort() 方法,通过该方法,我们传入参数1表示升序排列,-1表示降序排列。
例如,以下操作返回restaurant集合里的所有文档,按照borough升序排列,每一个borough里面,按照"address.zipcode"升序排列。
FindIterable<Document> iterable =
db.getCollection("restaurants").find() .sort(
new Document("borough", 1).append("address.zipcode", 1));
然后迭代出结果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
使用静态排序 Sort方法,还可以这么做:
db.getCollection("restaurants").find().sort(
ascending("borough", "address.zipcode"));
其他
更多内容,请看Java驱动包文档。Filter
---by 冰天百华