mongodb中非常好用的Aggregate入門(mén)教程
前言
aggregate 翻譯過(guò)來(lái)是聚合的意思, 但是在實(shí)際的使用的它的體驗(yàn)特別像linux中的管道, 每個(gè)管道處理完之后再把結(jié)果交個(gè)下一個(gè)管道, 你的數(shù)據(jù)就像水流, 最后通過(guò)各個(gè)管道你能夠得到你想要的數(shù)據(jù)
我們一般用Aggregate做什么
- 聚合 平均數(shù) 等數(shù)據(jù)處理 group sum
- 地理位置信息 $geoNear
- 基本上mongodb的所有查詢(xún)操作我們都可以用 aggregate實(shí)現(xiàn), 用好這個(gè)基本上是萬(wàn)金油了
在這里我主要想記錄一下mongodb在地理位置信息查詢(xún)中使用到的技術(shù),不僅可以查詢(xún)到 距離 還可以按照距離排序
$geoNear 地理位置信息查詢(xún)
首先我們的坐標(biāo)數(shù)據(jù)在庫(kù)里面怎么存, 類(lèi)型為 Array , 記得加 2d 索引, 當(dāng)然還有3d 索引, 目前還沒(méi)有用到
const storeschema = new mongoose.Schema({
name: { type: String, required: true },
point: { type: Array, required: true }, // [lon, lat]
});
storeschema.index({ point: '2d' });
return mongoose.model('store', storechema);
然后按照就是地理查詢(xún)代碼了
this.ctx.model.Store.aggregate([{
$geoNear: {
spherical: true, // spherical 是否按照球形狀來(lái)求距離
distanceMultiplier: 6378137,
maxDistance: 10000,
near: [ lon1, lat1 ],
distanceField: 'dist',
key: 'point',
query: {
}
},
},
//distanceMultiplier 這個(gè)參數(shù)是用于確定你返回的距離是什么單位 6378137 的單位是m
//maxDistance 查詢(xún)的最大距離
// near 中心點(diǎn)坐標(biāo)
// distanceField 距離放在哪個(gè)屬性
// key 保存坐標(biāo)數(shù)據(jù)的地方
// query 你的過(guò)濾條件
有一個(gè)很有意思的地方是
match 所以在這里有一個(gè) query屬性來(lái)補(bǔ)齊這種遺憾
但是你可以在 后面 使用$match 對(duì)查到的所有地理位置信息數(shù)據(jù)做再一次的篩選
$lookup mongodb中的聯(lián)表查詢(xún)
$lookup 是在比較新的mongodb版本中才能使用的屬性, 當(dāng)然這個(gè)屬性也是用于 aggregate中的, 它補(bǔ)齊了之前mongodb中無(wú)法聯(lián)表的遺憾
看代碼
await this.ctx.model.MemberInfo.aggregate([
{
$match: { store: new ObjectId(store) }
},
{
$lookup: {
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'user'
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [{ $arrayElemAt: [ '$user', 0 ] }, '$$ROOT' ] } }
},
{
$match: { 'certification.name': { $regex: search } }
},
{
$project: { _id: 1 }
}
]);
memberinfo 與 user 表在這里我想要獲取 memberinfo localField: 'user' 為外鍵對(duì)應(yīng) user表 foreignField: '_id' _id字段他的額外屬性...
說(shuō)白了 我的會(huì)員表里面只存了用戶(hù)的id 現(xiàn)在我想要拿到用戶(hù)的 其它信息...
附上鏈接吧 $lookup
寫(xiě)在最后
當(dāng)然說(shuō)他是查詢(xún)?nèi)f金油他當(dāng)然支持 定義數(shù)據(jù)的輸出
limit $sort 等常規(guī)操作
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
MongoDB分片在部署與維護(hù)管理中常見(jiàn)的事項(xiàng)總結(jié)大全
分片(sharding)是指將數(shù)據(jù)拆分,將其分散存放在不同的機(jī)器上的過(guò)程。下面這篇文章主要給大家總結(jié)介紹了關(guān)于MongoDB分片在部署與維護(hù)管理中常見(jiàn)事項(xiàng)的相關(guān)資料,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09
mongoDB 實(shí)現(xiàn)主從讀寫(xiě)分離實(shí)現(xiàn)的實(shí)例代碼
這篇文章主要介紹了 mongoDB 實(shí)現(xiàn)主從讀寫(xiě)分離實(shí)現(xiàn)的實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
MongoDB利用oplog恢復(fù)數(shù)據(jù)的方法
這篇文章主要介紹了MongoDB利用oplog恢復(fù)數(shù)據(jù)的方法,當(dāng)我們對(duì)數(shù)據(jù)出現(xiàn)誤操作的時(shí)候,可以利用oplog恢復(fù)數(shù)據(jù),下文操作過(guò)程需要的小伙伴可以參考一下2022-04-04
MongoDB多表關(guān)聯(lián)查詢(xún)操作實(shí)例詳解
這篇文章主要介紹了MongoDB多表關(guān)聯(lián)查詢(xún)操作,結(jié)合實(shí)例形式詳細(xì)分析了MongoDB數(shù)據(jù)庫(kù)實(shí)現(xiàn)多表關(guān)聯(lián)查詢(xún)的相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07
MongoDB錯(cuò)誤32-bit servers don''t have journaling enabled by de
這篇文章主要介紹了MongoDB錯(cuò)誤32-bit servers don't have journaling enabled by default解決方法,需要的朋友可以參考下2014-10-10
MongoDB數(shù)據(jù)庫(kù)中索引和explain的使用教程
這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫(kù)中索引和explain使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mongodb具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
Mac下安裝配置mongodb并創(chuàng)建用戶(hù)的方法
最近在在學(xué)習(xí)nodejs,相比mysql,mongodb與nodejs搭配更合適,存儲(chǔ)數(shù)據(jù)格式也比較接近JS對(duì)象。下面這篇文章主要給大家介紹了關(guān)于在Mac下安裝配置mongodb并創(chuàng)建用戶(hù)的相關(guān)資料,需要的朋友可以參考下2018-05-05
mongodb 數(shù)據(jù)庫(kù)操作--備份 還原 導(dǎo)出 導(dǎo)入
mongodb數(shù)據(jù)備份和還原主要分為二種,一種是針對(duì)于庫(kù)的mongodump和mongorestore,一種是針對(duì)庫(kù)中表的mongoexport和mongoimport。2014-07-07
MongoDB系列教程(三):Windows中下載和安裝MongoDB
這篇文章主要介紹了MongoDB系列教程(三):MongoDB下載和安裝,本文講解使用Windows環(huán)境安裝MongoDB,需要的朋友可以參考下2015-05-05
MongoDB4.0在windows10下的安裝與服務(wù)配置教程詳解
本文通過(guò)圖文并茂的形式給大家介紹了MongoDB4.0在windows10下的安裝與服務(wù)配置教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08

