sql >> データベース >  >> NoSQL >> MongoDB

複数の日付フィールドを使用して日ごとにグループ化

    また、基本的に各値を「入力」と「出力」の「タイプ」ごとにエントリの配列に結合することにより、ソースでドキュメントを分割することもできます。これは、 $ mapを使用して簡単に行うことができます。 および $ cond フィールドを選択するには、 $ unwind 配列を作成し、 <を使用して、再度「カウント」するフィールドを決定します。 code> $ cond

    collection.aggregate([
      { "$project": {
        "dates": {
          "$filter": {
            "input": { 
              "$map": {
                "input": [ "in", "out" ],
                "as": "type",
                "in": {
                  "type": "$$type",
                  "date": {
                    "$cond": {
                      "if": { "$eq": [ "$$type", "in" ] },
                      "then": "$inDate",
                      "else": "$outDate"
                    }
                  }
                }
              }
            },
            "as": "dates",
            "cond": { "$ne": [ "$$dates.date", null ] }
          }
        }
      }},
      { "$unwind": "$dates" },
      { "$group": {
        "_id": {
          "year": { "$year": "$dates.date" },
          "month": { "$month": "$dates.date" },
          "day": { "$dayOfMonth": "$dates.date" }
        },
        "countIn": {
          "$sum": {
            "$cond": {
              "if": { "$eq": [ "$dates.type", "in" ]  },
              "then": 1,
              "else": 0
            }
          }
        },
        "countOut": {
          "$sum": {
            "$cond": {
              "if": { "$eq": [ "$dates.type", "out" ]  },
              "then": 1,
              "else": 0
            }
          }
        }
      }}
    ])
    

    これは、送信するデータのサイズに関係なく、BSONの制限を超えるリスクを冒さずにこれを行うための安全な方法です。

    個人的には、別々のプロセスとして実行し、集約された結果を別々に「結合」したいのですが、それは実行している環境によって異なります。これは質問には記載されていません。

    「並列」実行の例として、Meteorのどこかでこれらの線に沿って構造化することができます:

    import { Meteor } from 'meteor/meteor';
    import { Source } from '../imports/source';
    import { Target } from '../imports/target';
    
    Meteor.startup(async () => {
      // code to run on server at startup
    
      await Source.remove({});
      await Target.remove({});
    
      console.log('Removed');
    
      Source.insert({
        "_id" : "XBpNKbdGSgGfnC2MJ",
        "po" : 72134185,
        "machine" : 40940,
        "location" : "02A01",
        "inDate" : new Date("2017-07-19T06:10:13.059Z"),
        "requestDate" : new Date("2017-07-19T06:17:04.901Z"),
        "outDate" : new Date("2017-07-19T06:30:34Z")
      });
    
      console.log('Inserted');
    
      await Promise.all(
        ["In","Out"].map( f => new Promise((resolve,reject) => {
          let cursor = Source.rawCollection().aggregate([
            { "$match": { [`${f.toLowerCase()}Date`]: { "$exists": true } } },
            { "$group": {
              "_id": {
                "year": { "$year": `$${f.toLowerCase()}Date` },
                "month": { "$month": `$${f.toLowerCase()}Date` },
                "day": { "$dayOfYear": `$${f.toLowerCase()}Date` }
              },
              [`count${f}`]: { "$sum": 1 }
            }}
          ]);
    
          cursor.on('data', async (data) => {
            cursor.pause();
            data.date = data._id;
            delete data._id;
            await Target.upsert(
              { date: data.date },
              { "$set": data }
            );
            cursor.resume();
          });
    
          cursor.on('end', () => resolve('done'));
          cursor.on('error', (err) => reject(err));
        }))
      );
    
      console.log('Mapped');
    
      let targets = await Target.find().fetch();
      console.log(targets);
    
    });
    

    のようなコメントで言及されているように、これは基本的にターゲットコレクションに出力されます。
    {
            "_id" : "XdPGMkY24AcvTnKq7",
            "date" : {
                    "year" : 2017,
                    "month" : 7,
                    "day" : 200
            },
            "countIn" : 1,
            "countOut" : 1
    }
    


    1. この単純なベンチマークでSQLiteがRedisよりも速いのはなぜですか?

    2. MongoDB集約フレームワークを使用して配列サイズのヒストグラムを取得する最速の方法

    3. ClouderaOperationalDatabaseとFlaskを使用してシンプルなCRUDWebアプリケーションとイメージストアを構築する

    4. マングース-ユニーク-バリデーターを動作させることができません