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(); } }); } }); } });
如下圖所示: