a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數(shù)據(jù)庫 > MongoDB > 正文

mongodb實現(xiàn)數(shù)組對象求和方法實例

2020-10-29 18:42:27
字體:
供稿:網(wǎng)友

前言

mongodb在計算集合數(shù)組值時候,我們通常會想到使用$group與$sum,但是如果是數(shù)組里面多個json對象,并且還需要根據(jù)條件過濾多個對象的內(nèi)容該如何處理?

現(xiàn)在讓我們來實現(xiàn)它,假設(shè)mongodb中有個user集合,其數(shù)據(jù)內(nèi)容如下:

/* 1 */{ "_id" : ObjectId("5c414a6a0847e00385143003"), "date" : "2019-01-18 09", "data" : [  {  "app_platform" : "ios",  "user" : 3028 },  {  "app_platform" : "android",  "user" : 4472 },  ]}...

現(xiàn)在我們需要計算date日期為"2019-01-18 09"并且app_platform的類型為"ios"的user總數(shù)

如果可以,請先思考下mongodb語句如何實現(xiàn)。

實現(xiàn)過程中有個執(zhí)行非常重要,即$unwind,官方解釋:

Deconstructs an array field from the input documents to output a document for each element. Each output document is the input document with the value of the array field replaced by the element.

從輸入文檔中解構(gòu)一個數(shù)組字段,為每個元素輸出一個文檔。每個輸出文檔都是輸入文檔,數(shù)組字段的值由元素替換。

于是我們便想到將data數(shù)組對象分條拆開,化繁為簡,mongodb語句如下:

db.getCollection('user').aggregate([ { $project: { _id: 1, data: 1, date: 1} }, {  $match: {"date": "2019-01-18 09"} },  { $unwind: "$data" },])

得到結(jié)果如下:

/* 1 */
{
    "_id" : ObjectId("5c414a6a0847e00385143003"),
    "date" : "2019-01-18 09",
    "data" : {
        "app_platform" : "ios",
        "user" : 3028
    }
}
/* 2 */
{
    "_id" : ObjectId("5c414a6a0847e00385143003"),
    "date" : "2019-01-18 09",
    "data" : {
        "app_platform" : "android",
        "user" : 4472
    }
}

可以看到數(shù)據(jù)由數(shù)組變成了多條文檔數(shù)據(jù),于是問題轉(zhuǎn)變?yōu)橛嬎憬Y(jié)果的user總數(shù),是不是覺得問題變簡單了,而且我們也可以繼續(xù)使用$match來過濾app_platform數(shù)據(jù),mongodb語句如下:

db.getCollection('user').aggregate([ { $project: { _id: 1, data: 1, date: 1} }, {  $match: {"date": "2019-01-18 09"} },  { $unwind: "$data" }, { $match: { "data.app_platform": { $in: ["ios"]} }, }])

執(zhí)行結(jié)果如下:

/* 1 */
{
    "_id" : ObjectId("5c414a6a0847e00385143003"),
    "date" : "2019-01-18 09",
    "data" : {
        "app_platform" : "ios",
        "user" : 3028
    }
}

可以看到數(shù)據(jù)已經(jīng)被過濾了,如果自信觀察兩個$match的作用可以發(fā)現(xiàn),mongodb是按順序執(zhí)行的,即$match作用于其前面的操作結(jié)果集合

讓我們繼續(xù)計算,此時只需要使用group與​sum對data里的user字段求和即可,mongodb語句如下:

db.getCollection('user').aggregate([ { $project: { _id: 1, data: 1, date: 1} }, {  $match: {"date": "2019-01-18 09"} },  { $unwind: "$data" }, { $match: { "data.app_platform": { $in: ["ios"]} } }, { $group: { _id: null, "user": {$sum: "$data.user"}} }])

結(jié)果如下:

/* 1 */
{
    "_id" : null,
    "user" : 7500
}

計算得出的user即我們所需要的數(shù)據(jù)。

其實所有的難點如下:

  • 計算數(shù)組對象數(shù)據(jù)時將其轉(zhuǎn)變?yōu)槎鄺l簡單的數(shù)據(jù)格式,$unwind指令將問題輕松得降低了難度
  • mongodb的執(zhí)行順序,$project,$match都是順序執(zhí)行并作用于之前的操作結(jié)果

理解了這兩點,相信再難的mongodb語句你也能實現(xiàn)。

happy coding!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美精品久久久久久久 | 国产一区二区av | 久免费视频 | 日韩一区二区在线观看 | 国内精品久久久久久中文字幕 | 国产免费看黄网站 | 男女羞羞视频免费在线观看 | 日韩三级免费观看 | 久久久久久av | 色爽女人免费 | 狠狠做深爱婷婷久久综合一区 | 这里有精品视频 | 精品国产乱码久久久久久久 | www.视频在线观看 | 在线播放黄 | av片在线观看 | 奇米影视首页 | 日本阿v视频高清在线中文 日本在线观看 | 亚洲jizzjizz日本少妇 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 欧美一区二区在线视频 | 精品国产污网站污在线观看15 | 日韩欧美一区二区三区免费观看 | 精品国产一区二区三区久久久蜜月 | 娇小12—13毛片 | 免费精品 | 日韩精品一区二区三区在线观看 | 日本天天操 | 久久99精品久久久 | 日韩美女亚洲99久久二区 | 久久国内精品 | 91人人 | 蜜臀99久久精品久久久久久软件 | 精品一区av | 99精品国产热久久91蜜凸 | 亚洲精品一区二区三区中文字幕 | 免费黄色片一区二区 | 99久久免费精品国产男女性高好 | 国产一区二精品区在线 | 免费黄色av | 国产精品久久久av |