1. 程式人生 > >mongodb 中非常好用的 Aggregate

mongodb 中非常好用的 Aggregate

mongodb 中非常好用的 Aggregate

aggregate 翻譯過來是聚合的意思, 但是在實際的使用的它的體驗特別像linux中的管道, 每個管道處理完之後再把結果交個下一個管道, 你的資料就像水流, 最後通過各個管道你能夠得到你想要的資料

我們一般用Aggregate做什麼

aggregate查詢文件

  1. 聚合 平均數 等資料處理 groupsum
  2. 地理位置資訊 $geoNear
  3. 基本上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 你的過濾條件 複製程式碼

有一個很有意思的地方是 geoNear **前面**不可以使用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

寫在最後

當然說他是查詢萬金油他當然支援 定義資料的輸出 skip 跳過多少記錄limit $sort 等常規操作