概述
在MongoDB中,你可以用查詢 find 方法來從一個(gè)集合中查詢數(shù)據(jù)。MongoDB的所有查詢都是單個(gè)集合范圍內(nèi)。
查詢能返回集合中的所有文檔,或者是最符合條件的文檔。你可以用
org.bson.Document里的find方法,傳入?yún)?shù)查詢。
該 find方法用FindIterable(生成文檔的迭代對象)來返回一個(gè)查詢結(jié)果。
預(yù)備條件
該例子仍然使用test數(shù)據(jù)庫中的restaurant集合。關(guān)于導(dǎo)入數(shù)據(jù)集的相關(guān)操作,請看之前的博文。
緊跟著之前的操作,從連接數(shù)據(jù)庫,到運(yùn)行MongoDB,到創(chuàng)建test數(shù)據(jù)庫和restaurant集合。
我們需要導(dǎo)入以下的包:
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;
在一個(gè)集合中查詢所有的文檔
為了查詢出所有的文檔,我們在find方法中不需要傳入任何條件。例如,以下的操作就能返回restaurant集合中的所有文檔:
FindIterable<Document> iterable = db.getCollection("restaurants").find();
迭代結(jié)果集,并用塊(block)運(yùn)用到每個(gè)文檔:
iterable.forEach(new Block<Document>() {
@Override public void apply(final Document document) {
System.out.println(document); }
});
該結(jié)果集包含了restaurant里的所有文檔。
指定平等條件
用MongoDB提供的Java驅(qū)動包來實(shí)現(xiàn)平等條件查詢,例如:
new Document( <field>, <value> )
如果<field>是一個(gè)內(nèi)嵌的文檔或者數(shù)組,用.點(diǎn)符號來訪問。
為了定制查詢條件,MongoDB的Java驅(qū)動包提供了 Filter類。該類包含各種靜態(tài)方法來簡化查詢操作,例如下面的 eq方法:
eq(<field>, <value>)
通過頂級域查詢
以下操作查詢 borough為 “Manhattan”的文檔。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("borough", "Manhattan"));
迭代結(jié)果集,并用塊(block)運(yùn)用到每個(gè)文檔:
iterable.forEach(new Block<Document>() {
@Override public void apply(final Document document) {
System.out.println(document); }
});
利用 Filter類提供的靜態(tài)方法,你還可以這么做:
db.getCollection("restaurants").find(eq("borough", "Manhattan"));
用嵌入式文檔查詢字段
為了在帶有嵌入式文檔的域中明確查詢條件,我們使用點(diǎn)記法。點(diǎn)記法需要傳入整個(gè)全限定名,以下操作指定查詢在address域里的zipcode嵌入文檔。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("address.zipcode", "10075"));
迭代結(jié)果集:
iterable.forEach(new Block<Document>() {
@Override public void apply(final Document document) {
System.out.println(document);
}});
或者用Filter類的靜態(tài)方法,還可以這么做:
db.getCollection("restaurants").find(eq("address.zipcode", "10075"));
更多關(guān)于帶有嵌入文檔的查詢,請看Embedded Documents
數(shù)組中的域查詢
grade數(shù)組包括很多嵌入的文檔。要明確查詢條件,我們用點(diǎn)記法。
點(diǎn)記法仍然需要我們傳入整個(gè)全限定名,以下操作是獲得grade為B的結(jié)果集。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("grades.grade", "B"));
迭代結(jié)果:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter類提供的靜態(tài)方法,
db.getCollection("restaurants").find(eq("grades.grade", "B"));
更多關(guān)于數(shù)組的查詢,請看Arrays
明確條件的操作
MongoDB提供明確條件的查詢,例如比較操作Comparison Query Operators,盡管還有一些比如or和and操作,這些操作的大致都有以下格式:
new Document( <field>, new Document( <operator>, <value> ) )
為了明確查詢條件,MongoDB的Java驅(qū)動包提供了Filter類提供很多靜態(tài)方法建立查詢,其中包括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)));
然后迭代結(jié)果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter類提供的靜態(tài)方法:
db.getCollection("restaurants").find(gt("grades.score", 30));
lt的操作
我們查詢出grade里score小于10的結(jié)果集:
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("grades.score", new Document("$lt", 10)));
迭代出結(jié)果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter類提供的靜態(tài)方法:
db.getCollection("restaurants").find(lt("grades.score", 10));
聯(lián)合查詢
你可以用邏輯連接詞 and或者 or來構(gòu)建聯(lián)合查詢。
邏輯詞 and
你可以用邏輯詞 and 來構(gòu)建多條件查詢語句。更多操作請看org.Bson.Document類。
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document(
"cuisine", "Italian").append("address.zipcode", "10075"));
迭代出結(jié)果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter類提供的靜態(tài)方法:
db.getCollection("restaurants").find(and(
eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
邏輯連接詞or
你可以用邏輯連接詞or來構(gòu)建查詢:
FindIterable<Document> iterable =
db.getCollection("restaurants").find(
new Document("$or", asList(new Document(
"cuisine", "Italian"),
new Document("address.zipcode", "10075"))));
然后迭代出結(jié)果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
或者可以用Filter類提供的靜態(tài)方法:
db.getCollection("restaurants").find(
or(eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
給結(jié)果集排序
給結(jié)果集排序,我們用 sort() 方法,通過該方法,我們傳入?yún)?shù)1表示升序排列,-1表示降序排列。
例如,以下操作返回restaurant集合里的所有文檔,按照borough升序排列,每一個(gè)borough里面,按照"address.zipcode"升序排列。
FindIterable<Document> iterable =
db.getCollection("restaurants").find() .sort(
new Document("borough", 1).append("address.zipcode", 1));
然后迭代出結(jié)果集:
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}});
使用靜態(tài)排序 Sort方法,還可以這么做:
db.getCollection("restaurants").find().sort(
ascending("borough", "address.zipcode"));
其他
更多內(nèi)容,請看Java驅(qū)動包文檔。Filter
---by 冰天百華