官方文檔地址:http://docs.mongodb.org/manual/applications/read/
讀操作
在數據庫的四種基礎操作中,讀操作是指那些從MongoDB聚集中檢索記錄或文檔的操作。
你可以通過以下任意一種方法從MongoDB中檢索文檔:
1.find
2.findOne
Find
find方法是從聚集中檢索衆多文檔的基礎方法,find()方法返回包含若干文檔的cursor。大多數的
驅動程序都向應用程序開發者提供了一種本地的可遍歷藉口來處理cursor和遍歷文檔。find()方法
包含如下句法:
db.collection.find( <query>, <projection> )
SQL中類似的操作:find()方法類似於SQL中的SELECT語句。
1.<query>參數類似於WHERE字句,而且
2.<projection>參數類似於將要從結果集合中檢索的目標字段。
通過下面的示例來闡述find()方法的使用:
這個示例相關於一個bios的聚集,該聚集中有如下文檔原型:
{
"_id" : 1,
"name" : {
"first" : "John",
"last" :"Backus"
},
"birth" : ISODate("1924-12-03T05:00:00Z"),
"death" : ISODate("2007-03-17T04:00:00Z"),
"contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
"awards" : [
{
"award" : "W.W. McDowellAward",
"year" : 1967,
"by" : "IEEE Computer Society"
},
{
"award" : "National Medal of Science",
"year" : 1975,
"by" : "National Science Foundation"
},
{
"award" : "Turing Award",
"year" : 1977,
"by" : "ACM"
},
{
"award" : "Draper Prize",
"year" : 1993,
"by" : "National Academy of Engineering"
}
]
}
注意:在mongo shell中,你可以通過在find()後面添加.pertty()來格式化輸出。
1.如果沒有<query>參數,find()方法會返回聚集中的所有文檔,
下面的操作返回bios聚集中的所有文檔,(更精確的說法,返回一個cursor)
db.bios.find()
2.如果有<query>參數,find()方法會從聚集的所有文檔中選擇滿足query標準的。
下面的掃做返回bios聚集中所有_id字段爲5或者ObjectId("507c35dd8fada716c89d0013")
db.bios.find(
{
_id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] }
}
)
下面的操作返回bios聚集中array字段contribs中包含unix的文檔:
db.bios.find(
{
contribs: 'UNIX'
}
)
下面操作返回bios聚集中array字段awards包含一個子文檔,該子文檔包含award字段裏有T如ing Arard
而且year字段大於1980:
db.bios.find(
{
awards: {
$elemMatch: {
award: 'Turing Award',
year: { $gt: 1980 }
}
}
}
)
下面的操作返回bios聚集中一個子文檔“name"中包含字段first值爲”Yukihiro“而且
last字段值爲”Matsumoto“,quer通過.操作符來訪問子文檔的字段:
db.bios.find(
{
'name.first': 'Yukihiro',
'name.last': 'Matsumoto'
}
)
實際上,上面的操作對於下面連各種情況都會匹配:
{
first: 'Yukihiro',
aka: 'Matz',
last: 'Matsumoto'
}
{
last: 'Matsumoto',
first: 'Yukihiro'
}
下面的操作會返回bios聚集中子文檔name字段確切的{ first: 'Yukihiro', last: 'Matsumoto' },並且順序
也一致:
db.bios.find(
{
name: {
first: 'Yukihiro',
last: 'Matsumoto'
}
}
)
上面的操作會嚴格的匹配子文檔中的數值包括順序,二下面的語句就不會了:
{
first: 'Yukihiro',
aka: 'Matz',
last: 'Matsumoto'
}
{
last: 'Matsumoto',
first: 'Yukihiro'
}
下面的操作會返回bios聚集中name子文檔下first字段值爲字母G開頭或者birth字段的值
小於new Date('01/01/1945'):
db.bios.find(
{ $or: [
{ 'name.first' : /^G/ },
{ birth: { $lt: new Date('01/01/1945') } }
]
}
)
下面的操作會返回bios聚集中name子文檔下first字段值爲字母K開頭並且contribs字段中
包含UNIX值得文檔:
db.bios.find(
{
'name.first': /^K/,
contribs: 'UNIX'
}
)
在上面的查詢中,參數(兩個參數)通過一個隱式的AND在兩個不同的字段之間進行連接,如果
AND之間連接的字段是相同的,則需要用$and操作符!
如果存在<projection>參數,那麼find()方法只會返回<projection>參數中指定的要包含
或者排除的字段!
注意:_id字段默認的被包含在<projection>參數中,在projection中所有明確指出包含的
字段中,_id字段是你可以明確排除的,否則,你將不能使包含字段與排除字段的說明!
(原文:The _id field is implicitly included in the <projection> argument.
In projections that explicitly include fields,
_id is the only field that you can explicitly exclude.
Otherwise, you cannot mix include field and
exclude field specifications.)
下面的操作將會返回bios聚集的所有文檔的name字段,contribs字段,以及_id字段:
db.bios.find(
{ },
{ name: 1, contribs: 1 }
)
下面的操作會返回bios聚集的所有文檔中的name字段和congribs字段:
db.bios.find(
{ },
{ name: 1, contribs: 1, _id: 0 }
)
下面的操作會返回bios聚集的所有文檔中contribs字段中包含元素:”OOP“並且從結果文檔中返回所有字段但是排除:
_id,name中first字段,birth字段!
db.bios.find(
{ contribs: 'OOP' },
{ _id: 0, 'name.first': 0, birth: 0 }
)
下面的操作會返回bios聚集的所有文檔中name子文檔的last字段,以及contribs字段中的前兩項內容!
db.bios.find(
{ },
{
_id: 0,
'name.last': 1,
contribs: { $slice: 2 }
}
)
遊標
find()方法返回一個結果的cursor,在mongo shell中,如果返回的cursor沒有被賦值給
一個變量,那麼這個cursor會被自動的遍歷20次來打印cursor中的前20個文檔,示例如下:
db.bios.find( { _id: 1 } );
當你把find()賦值到一個變量的時候:
1.你可以輸入變量的名字來顯示匹配的文檔中的前20條。如下所示:
var myCursor = db.bios.find( { _id: 1 } );
myCursor
2.你可以使用cursor的next()方法來訪問文檔,如下所示:
var myCursor = db.bios.find( { _id: 1 } );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
}
爲了輸出,你也可以使用pringjson()方法來代替print(tojson()):
if (myDocument) {
var myName = myDocument.name;
printjson(myName);
}
你也可以使用cursor的forEach()方法來遍歷遊標並訪問文檔,如下所示:
var myCursor = db.bios.find( { _id: 1 } );
myCursor.forEach(printjson);
注意:你可以使用DBQuary.shellBatchSize來改變cursor中的默認值20.
修改遊標行爲:
除了<query>和<projection>參數之外,mongo shell和drivers提供了其他的方法
所以你可以在find()方法返回的cursor上調用這些方法來改變cursor的行爲,這些方法是:
1.sort,通過method指定的一個或多個字段來對結果集中的文檔排序!
下面的操作會對bios聚集中返回的cursor進行按照name的升序排列:
db.bios.find().sort( { name : 1 } )
sort()類似於SQL中的ORDER BY子句!
2.limit()方法用來限制結果集中文檔的數量。
下面的操作會返回bios聚集中最多5條文檔:
db.bios.find().limit(5)
limit()方法類似於SQL中的LIMIT子句!
3.skip()方法控制着結果集的起點!
下面的操作返回bios聚集的所有文檔中返回的cursor,跳過前5條:
db.bios.find().skip(5)
你可以像下面一樣連接這幾個cursor方法:
db.bios.find().sort( {name:1} ).limit(5)
db.bios.find().limit( 5 ).sort( {name:1} )
Find One
findOne()方法從聚集中返回一個單獨的文檔並且不會返回cursor。
findOne()方法有如下句法:
db.collection.findOne( <query>,<projection> )
除了返回值,findOne()方法非常類似於find()方法。事實上,在內部中,
findOne()方法就是帶limit(1)的find()!
通過下面的示例來理解findOne()方法的使用:
1.如果沒有<query>參數,findOne()方法僅僅從聚集中攢則一個文檔。
下面的操作從bios聚集中返回一個單獨的文檔。
db.bios.findOne()
2.如果有<query>參數,findOne()方法從滿足<query>條件的集合中選擇一個文檔!
下面的操作會在bios聚集的文檔中選擇第一條(first matching)滿足子文檔name中的first字段以G字母開頭或者birth字段小於new Date('01/01/1945')的記錄:
db.bios.findOne(
{
$or: [
{ 'name.first' : /^G/ },
{ birth: { $lt: new Date('01/01/1945') } }
]
}
)
3.你可以向findOne()方法傳遞一個<projection>參數來控制結果集中的字段:
下面的操作返回bios聚集的所有文檔中的一條,且只包含name字段,contribs字段,當然,還有_id字段:
db.bios.findOne(
{ },
{ name: 1, contribs: 1 }
)
下面的操作返回bios聚集的所有文檔中滿足contribs字段包含”OOP“的記錄,但是返回的字段中排除_id,name.first,birth:
db.bios.findOne(
{ contribs: 'OOP' },
{ _id: 0, 'name.first': 0, birth: 0 }
)
儘管於find()方法很相似,由於findOne()方法返回的是文檔而並不是cursor,所以你並不能把cursor上的方法諸如:sort(),skip(),limit()等,但是你可以直接訪問文檔,如下所示:
var myDocument = db.bios.findOne();
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
}
Mongo官方文檔翻譯 (三)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Mongo官方文檔翻譯 (四)
Avin
2018-08-25 15:41:22
Mongo官方文檔翻譯 (五)
Avin
2018-08-25 15:41:22
Mongo官方文檔翻譯 (二)
Avin
2018-08-25 15:41:20
MongoBD命令大全
Tonny__
2018-08-27 11:59:15
MongoDB windows32 部署分片數據集
大虫吃小虫虫虫
2018-08-27 06:14:59
當Mongo查詢中的需要的鍵爲變量時,該怎麼辦?
大虫吃小虫虫虫
2018-08-27 06:13:07
mongodb--replication複製集快速學習
大虫吃小虫虫虫
2018-08-27 06:13:07
[MongoDB] 練習操作
qingaoti
2018-08-26 22:08:17
laravel 中使用mongodb創建Model並使用
cwallow
2018-08-26 18:08:20
【Mongo】創建索引
EDDYQ
2018-08-26 12:58:42
【Mongo】 批量刪除集合
EDDYQ
2018-08-26 12:58:41
Mongodb stop: Unknown instance報錯
君子动口又动手
2018-08-26 09:45:44
Mongo:You cannot currently mix including and excluding fields. Contact us if this is an issue.
Avin
2018-08-25 15:41:20
Mongodb 多集合 多表 統計實戰
微风Jade
2018-08-25 12:59:34
在ubuntu上安裝MongoDB 來自mongo官方
微风Jade
2018-08-25 12:59:30