mongodb 中非常好用的 Aggregate
阿新 • • 發佈:2018-12-10
mongodb 中非常好用的 Aggregate
aggregate 翻譯過來是聚合的意思, 但是在實際的使用的它的體驗特別像linux中的管道, 每個管道處理完之後再把結果交個下一個管道, 你的資料就像水流, 最後通過各個管道你能夠得到你想要的資料
我們一般用Aggregate做什麼
- 聚合 平均數 等資料處理 sum
- 地理位置資訊 $geoNear
- 基本上mongodb的所有查詢操作我們都可以用 aggregate實現, 用好這個基本上是萬金油了
在這裡我主要想記錄一下mongodb在地理位置資訊查詢中使用到的技術,不僅可以查詢到 距離
$geoNear 地理位置資訊查詢
首先我們的座標資料在庫裡面怎麼存, 型別為 Array , 記得加 2d 索引, 當然還有3d 索引, 目前還沒有用到
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);
複製程式碼
然後按照就是地理查詢程式碼了
this.ctx.model.Store.aggregate([{
$geoNear: {
spherical: true, // spherical 是否按照球形狀來求距離
distanceMultiplier: 6378137,
maxDistance: 10000,
near: [ lon1, lat1 ],
distanceField : 'dist',
key: 'point',
query: {
}
},
},
//distanceMultiplier 這個引數是用於確定你返回的距離是什麼單位 6378137 的單位是m
//maxDistance 查詢的最大距離
// near 中心點座標
// distanceField 距離放在哪個屬性
// key 儲存座標資料的地方
// query 你的過濾條件
複製程式碼
有一個很有意思的地方是 match 所以在這裡有一個 query屬性來補齊這種遺憾
但是你可以在 後面 使用$match 對查到的所有地理位置資訊資料做再一次的篩選
$lookup mongodb中的聯表查詢
$lookup 是在比較新的mongodb版本中才能使用的屬性, 當然這個屬性也是用於 aggregate中的, 它補齊了之前mongodb中無法聯表的遺憾
看程式碼
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'
為外來鍵對應 user表 foreignField: '_id'
_id欄位他的額外屬性...
說白了 我的會員表裡面只存了使用者的id 現在我想要拿到使用者的 其它資訊...
附上鍊接吧 $lookup
寫在最後
當然說他是查詢萬金油他當然支援 定義資料的輸出 limit $sort 等常規操作