Mongo官方文檔翻譯 (三)

官方文檔地址: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));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章