MongoDB資料庫中查詢資料(下)

龍恩0707發表於2018-06-25

MongoDB資料庫中查詢資料(下)

在find中,options引數值為一個物件,用來設定查詢資料時使用的選項,下面我們來對該引數值物件中可以使用的屬性進行介紹:

1. fields; 該屬性值為一個物件,該物件中各屬性名用來顯示指定在查詢結果中需要包含或排除的欄位。該屬性值可以為1或0,當屬性值為1時,代表需要在查詢結果中包含該欄位,當屬性值為0時,代表需要在查詢結果中排除該欄位。
注意:在使用fields屬性時,需要統一使用屬性值1或屬性值0來設定除_id欄位之外的所有欄位。

首先我們來看下資料庫中有哪些資料,如下所示:

下面我們使用fields欄位來在查詢結果中包含或排除哪些欄位,下面是在查詢結果中指定只包含 userName: '龍恩'的欄位(不單獨指定_id欄位時,_id欄位也預設包含);如下程式碼:

collection.find({userName:'龍恩'},{fields: {userName: 1}});

所有程式碼如下:

const mongo = require('mongodb');
const Server = mongo.Server;
const Db = mongo.Db;

const server = new Server('localhost', '27017', { auto_reconnect: true });
const db = new Db('dataDb', server, { safe: true });

db.open(function(err, db) {
  if (err) {
    throw err;
  } else {
    console.log('成功建立資料庫連線');
    db.collection('users', function(err, collection) {
      if (err) {
        throw err;
      } else {
        // 開始查詢集合users
        collection.find({userName:'龍恩'},{fields: {userName: 1}}).toArray(function(err, docs) {
          if (err) {
            throw err;
          } else {
            console.log(docs);
            db.close();
          }
        });
      }
    });
  }
});

如下圖所示:

我們可以單獨指定_id欄位是否需要包含或刪除,如下是我們在查詢結果中指定排除_id欄位,如下程式碼:

collection.find({userName:'空智'}, {fields: {userName: 1, _id: 0}});

所有程式碼如下:

const mongo = require('mongodb');
const Server = mongo.Server;
const Db = mongo.Db;

const server = new Server('localhost', '27017', { auto_reconnect: true });
const db = new Db('dataDb', server, { safe: true });

db.open(function(err, db) {
  if (err) {
    throw err;
  } else {
    console.log('成功建立資料庫連線');
    db.collection('users', function(err, collection) {
      if (err) {
        throw err;
      } else {
        // 開始查詢集合users
        collection.find({userName:'空智'}, {fields: {userName: 1, _id: 0}}).toArray(function(err, docs) {
          if (err) {
            throw err;
          } else {
            console.log(docs);
            db.close();
          }
        });
      }
    });
  }
});

如下圖所示:

如果在fields物件中使用屬性值0來設定某些欄位,則查詢結果將包含除這些欄位之外的所有欄位。

我們可以先查詢  userName="空智"這個欄位後,然後通過fields來排除userName這個屬性值,因此程式碼可以改成如下:

collection.find({userName: '空智'}, {fields: {userName: 0}});

所有程式碼如下所示:

const mongo = require('mongodb');
const Server = mongo.Server;
const Db = mongo.Db;

const server = new Server('localhost', '27017', { auto_reconnect: true });
const db = new Db('dataDb', server, { safe: true });

db.open(function(err, db) {
  if (err) {
    throw err;
  } else {
    console.log('成功建立資料庫連線');
    db.collection('users', function(err, collection) {
      if (err) {
        throw err;
      } else {
        // 開始查詢集合users
        collection.find({userName: '空智'}, {fields: {userName: 0}}).toArray(function(err, docs) {
          if (err) {
            throw err;
          } else {
            console.log(docs);
            db.close();
          }
        });
      }
    });
  }
});

如下圖所示:

2. sort;
該屬性是需要用來排序的欄位,該屬性值可以為一個陣列或物件。
2.1 屬性值為陣列的情況下:
當屬性值為一個陣列時,該陣列就包含兩個元素,第一個元素值為用於排序的欄位名,第二個元素值可以為1或-1,元素值為1時指定升序排序,元素值為-1時指定降序排序。且每一個元素為陣列。
下面程式碼是通過type欄位進行升序排序,price欄位降序排序;程式碼如下:

collection.find({},
   { sort: 
      [
        ['type', 1],
        ['price', -1]
      ]
    }
)

如下所有程式碼:

const mongo = require('mongodb');
const Server = mongo.Server;
const Db = mongo.Db;

const server = new Server('localhost', '27017', { auto_reconnect: true });
const db = new Db('dataDb', server, { safe: true });

db.open(function(err, db) {
  if (err) {
    throw err;
  } else {
    console.log('成功建立資料庫連線');
    db.collection('users', function(err, collection) {
      if (err) {
        throw err;
      } else {
        // 開始查詢集合users
        collection.find({},
          { sort: 
            [
              ['type', 1],
              ['price', -1]
            ]
          }
        ).toArray(function(err, docs) {
          if (err) {
            throw err;
          } else {
            console.log(docs);
            db.close();
          }
        });
      }
    });
  }
});

查詢結果如下所示:

2.2 屬性值為物件時
當sort屬性值為一個物件時,該物件中各屬性名為用於排序的欄位名,各屬性值可以為1或-1,屬性值為1時指定升序排序,屬性值為-1時指定降序排序。
下面程式碼是通過type欄位進行升序排序,price欄位降序排序;程式碼如下:

collection.find({},{sort: {type: 1, price: -1}});

所有程式碼還是和上面一樣,只是把查詢條件換了一下,執行結果和上面一樣的。 可以看到屬性值為物件時比陣列更簡單點。

3. limit
該屬性是來限定查詢結果條數,該屬性值為一個整數,用於指定查詢結果條數。

我們現在來修改查詢的程式碼,我現在來查詢 userName='空智'的其中2條資料,如下程式碼所示:

collection.find({userName: '空智'}, {limit: 2});

執行結果如下所示:

4. skip
該屬性是來限定在從符合查詢條件的結果中跳過前面多少條資料的文件,該屬性值為一個整數,用於指定跳過的資料文件條數。

首先我們來看下資料庫中一共有如下資料,如下所示:

然後我們在查詢結果中指定查詢 userName = '空智'的欄位,資料庫中一共有8條 userName='空智'的資料,我們現在跳過前面6條,從第七條開始,如下程式碼即可:

collection.find({userName: '空智'}, {skip: 6});

執行結果如下所示:

5. explain
該屬性是來檢視在執行一個find方法查詢資料時的詳細效能資訊,使用該屬性後,find方法並不真正執行資料的查詢操作,該方法只返回在查詢資料時的效能資訊。如下程式碼:

collection.find({},{explain: true})

所有程式碼如下:

const mongo = require('mongodb');
const Server = mongo.Server;
const Db = mongo.Db;

const server = new Server('localhost', '27017', { auto_reconnect: true });
const db = new Db('dataDb', server, { safe: true });

db.open(function(err, db) {
  if (err) {
    throw err;
  } else {
    console.log('成功建立資料庫連線');
    db.collection('users', function(err, collection) {
      if (err) {
        throw err;
      } else {
        // 開始查詢集合users
        collection.find({},{explain: true}).toArray(function(err, docs) {
          if (err) {
            throw err;
          } else {
            console.log(docs);
            db.close();
          }
        });
      }
    });
  }
});

如下圖所示:

6. raw
該引數值物件中的raw屬性來指定在查詢資料時是否將二進位制BSON資料文件存放在快取區中,然後將該快取區作為查詢結果進行返回。 如下程式碼:

collection.find({},{raw: true});

如下圖所示:

7. findOne

該方法是從一個集合中查詢一條資料文件,當一個集合中存在多條符合查詢條件的資料文件時,在預設情況下只返回第一條資料文件。
如下使用:

collection.findOne(selector, [options], callback);

selector 是查詢條件,必填項。
options 是查詢資料的限定條件。
callback: 用於指定獲取查詢資料操作結束時執行的回撥函式,該回撥函式如下所示:

function(err, docs) {}

第一個引數err是為獲取資料操作失敗時觸發的錯誤物件,第二個引數為查詢到的資料文件。如下程式碼:

collection.findOne({}, function(err, docs){})

所有程式碼如下:

const mongo = require('mongodb');
const Server = mongo.Server;
const Db = mongo.Db;

const server = new Server('localhost', '27017', { auto_reconnect: true });
const db = new Db('dataDb', server, { safe: true });

db.open(function(err, db) {
  if (err) {
    throw err;
  } else {
    console.log('成功建立資料庫連線');
    db.collection('users', function(err, collection) {
      if (err) {
        throw err;
      } else {
        // 開始查詢集合users
        collection.findOne({}, function(err, docs) {
          if (err) {
            throw err;
          } else {
            console.log(docs);
            db.close();
          }
        });
      }
    });
  }
});

如下圖所示:

相關文章