条件付き合計のためのMongoDB集約 -- mongodb フィールド と mongoose フィールド と mongodb-query フィールド と nosql フィールド と aggregation-framework フィールド 関連 問題

MongoDB Aggregation for building conditional sums












2
vote

問題

日本語

私のMongoDBにユーザー文書をいくつか持っているふりをしましょう。すべてのユーザーには、<コード> 99887763 (int)と presence Days(Boolean)。

マイドキュメントスキーマ

<事前> <コード> { type: NumberInt() // 1|2|3 presence: { day1: true, day2: false, day3: true }

折れ線チャートでの正面化を視覚化するために、ユーザーの種類ごとに正常な日数を数えたいです。必要な出力はこのように見える必要があります。タイプを表す配列内の3つのオブジェクト。すべてのオブジェクトにシリーズがあります。それらは、指定された日に存在する特定の種類のユーザーの合計を表します。

募集結果

<事前> <コード> [{ name: "Type1" series: [{ name: "Day1", value: 5, // count (type==1 && d1==true) }, { name: "Day2", value: 8, // count (type==1 && d2==true) }, { name: "Day3", ... }] }, { name: "Type2" series: [{ name: "Day1", value: 10, // count (type==2 && d1==true) }, {}, {}] }, { name: "Type3" series: [{}, {}, {}] }, { name: "AllCombined" series: [{}, {}, {}] }]

質問

MongoDB集約でどのように達成することができますか? <コード> $match 、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、、<コード>)事前にありがとう:)

要求されたサンプル:ユーザーコレクション

<事前> <コード> private void getJockyLatLongFromBackEnd() { final String getJockyID_URL = getProfileInformationURL(getUserAccessToken(UserSideTrackingPage.this), Other_UserID); Log.e("getJockyID_URL", getJockyID_URL); StringRequest request = new StringRequest(Request.Method.GET, getJockyID_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { if (response != null && !response.startsWith("<HTML>")) { } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("Error", error.toString()); } }); RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); queue.add(request); } 1
英語

Let's pretend I have some user documents in my MongoDB. Every user has a type (int) and presence days (boolean).

my documents schema

{   type: NumberInt() // 1|2|3   presence: {     day1: true,     day2: false,     day3: true } 

I want to count the precence days for each type of user to visualize their precence in a line chart. The needed output has to look like this. Three objects in an array representing the types. Every object has series. They represent the sum of users of a specific type present at the named day.

wanted result

[{   name: "Type1"   series: [{     name: "Day1",     value: 5, // count (type==1 && d1==true)   }, {     name: "Day2",     value: 8, // count (type==1 && d2==true)   }, {     name: "Day3",     ...   }] }, {   name: "Type2"   series: [{     name: "Day1",     value: 10, // count (type==2 && d1==true)   }, {}, {}] }, {   name: "Type3"   series: [{}, {}, {}] }, {   name: "AllCombined"   series: [{}, {}, {}] }] 

Question

How can I achive that with mongodb aggregation? I played around with $match, $sort, $project, $sum but I couldn't figure it out. Thanks in advance :)

requested samples: user collection

{_id: ..., type: 1, presence: {d1:true, d2: true, d3: false}} {_id: ..., type: 2, presence: {d1:false, d2: true, d3: false}} {_id: ..., type: 3, presence: {d1:true, d2: false, d3: true}} {_id: ..., type: 1, presence: {d1:true, d2: false, d3: false}} 
</div
              
 
 

回答リスト

1
 
vote
vote
ベストアンサー
 

以下の集計

を使用できます。 <事前> <コード> db.collection.aggregate([ { "$group": { "_id": "$type", "d1": { "$sum": { "$cond": [{ "$eq": ["$presence.d1", true] }, 1, 0] }}, "d2": { "$sum": { "$cond": [{ "$eq": ["$presence.d2", true] }, 1, 0] }}, "d3": { "$sum": { "$cond": [{ "$eq": ["$presence.d3", true] }, 1, 0] }} }}, { "$project": { "_id": 0, "name": { "$concat": ["Type", { "$toString": "$_id" }] }, "series": [ { "name": "Day1", "value": "$d1" }, { "name": "Day2", "value": "$d2" }, { "name": "Day3", "value": "$d3" } ] }} ])
 

You can use below aggregation

db.collection.aggregate([   { "$group": {     "_id": "$type",     "d1": { "$sum": { "$cond": [{ "$eq": ["$presence.d1", true] }, 1, 0] }},     "d2": { "$sum": { "$cond": [{ "$eq": ["$presence.d2", true] }, 1, 0] }},     "d3": { "$sum": { "$cond": [{ "$eq": ["$presence.d3", true] }, 1, 0] }}   }},   { "$project": {     "_id": 0,     "name": { "$concat": ["Type", { "$toString": "$_id" }] },     "series": [       {         "name": "Day1",         "value": "$d1"       },       {         "name": "Day2",         "value": "$d2"       },       {         "name": "Day3",         "value": "$d3"       }     ]   }} ]) 
</div
 
 

関連する質問

3  Mongo AddtoSet複数のオブジェクトを1つの配列に  ( Mongo addtoset multiple objects into one array ) 
Mongoで集約するときに複数のアレイに複数のオブジェクトを追加するために$ ADDTOSETを使用しようとしています。 データのフォーマットは最善ではないかもしれませんが、変更することができません。ここに照会している文書の種類の例です。 <事前> <コード...

0  日付範囲と数の増加のためのMongoDBチャート  ( Mongodb charts for date ranges and increasing numbers ) 
私はMongoDBの私の電力計の電力計を救いたいです。 現在の値はデータベースに格納されます。 https://gist.github.com/ffaerber/9473682 (1440分== 1日) データベースこのように見えます。 https://g...

0  フィールドとしてエントリとストアをカウントします  ( Count entries and store as field ) 
私のDBには、すべての子供の「三重大」を数える必要があり、旅行ごとに期間のエントリーがあるため、「TripCount」の下に保存する必要があります。 <事前> <コード> config.rb9 次のクエリがありますが、常に0.0を返します.MongoDBの構...

0  MongoDB他の列のデータとグループビーを見つけます  ( Mongodb find data and groupby for another column ) 
<事前> <コード> { "_id" : ObjectId("5763e4d6c0140edcb8731485"), "_class" : "net.microservice.product.domain.Product...

1  2つのフィールドを$ Lookupで比較するクエリ  ( Query which compares two fields with lookup ) 
ユーザコレクション <事前> <コード> [ {name: "alex", age: 25, surname: "brown"}, {name: "tom", age: 34, surname: "gray"}, {name: "...

1  MongoDB集計$ PROJECTATEの「一貫した」オブジェクトを返す  ( Mongodb aggregate project to returns a consistent object ) 
$ PROJECTを使用しているので、私のReturnオブジェクトは一貫していますが、それがレコードにない場合はフィールドをスキップするように見えます。 例データセット: <事前> <コード> { _id: 1, age: 32, name: "bob", ...

0  $ ADDTOSETはあまりにも多くのメモリを使用し、ディスクにこぼれません。メモリ制限:104857600バイト  ( Addtoset used too much memory and cannot spill to disk memory limit 104857600 ) 
<事前> <コード> [ { $match: { $and: [ { $or: [ { assignee: 'eaa68f83-5024-4a8e-93f0-4b849d598...

1  MongoDB - 同じ文書に対する2つの依存集約  ( Mongodb two depend aggregations for the same document ) 
次のコレクションを与えたとします。 <事前> <コード> {"Year" : 2014, "State" : "AZ", "Distributer" : "AAA", "Revenu_category_A" : 300, "Revenu_category_B"...

2  Spring Data Mongo Aggregationを使用したカーソル  ( Cursor with spring data mongo aggregation ) 
スプリングデータのMongoDB集約でカーソルを返す方法はありますか? <事前> <コード> Aggregation agg = newAggregation( match(Criteria.where("_id").is(objId)...

0  Spring Mongo DB - 配列内の一致する要素に基づいてドキュメントを取得する  ( Spring mongo db retrieve documents based on matching elements in an array ) 
Mongo DB に新しい 私は製品コレクションを持っていて、製品asOns の配列を含みます。 <事前> <コード> { "_id" : "999999999", "brand" : "BR", "division" : "331", "departme...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有