1. ホーム
  2. データベース
  3. モンゴルディーブ

MongoDB の一般的なクエリ文のサンプルコード

2022-01-19 06:44:57

背景

最近、いくつかのルールロジックを作りました。使用は、より多くのmongoのクエリに、トランザクション商人をフィルタリングするために確立されたルールを実行するトランザクション情報を照会することです、統計情報の集計パイプラインを使用して、単純な処理後のデータを取り出し、SQLの代わりにビジネスコードのロジック判断を使用する。

メソッド

MongoDB のアグリゲーションでは aggregate 集約パイプラインは、以下のような基本構文形式で、自動的な下方向のサブ実行のアプローチをとります。

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

アグリゲーションフレームワークでよく使われる操作です。

  • $projectを使用します。入力ドキュメントの構造を変更します。フィールドの名前の変更、追加、削除のほか、計算結果やネストされたドキュメントの作成に使用できます。
  • マッチ データをフィルタリングし、条件に一致するドキュメントのみを出力するために使用されます。データをフィルタリングして、条件に一致するドキュメントだけを出力するのに使います。match は MongoDB の標準クエリ操作を使います。
  • Limit: MongoDB 集約パイプラインが返すドキュメントの数を制限するために使います。
  • skip: 集約パイプラインで指定した数のドキュメントをスキップし、残りのドキュメントを返します。
  • ドキュメント内の特定の配列型フィールドを複数のエントリに分割し、 それぞれに配列からの値をひとつずつ格納する $unwind: ドキュメント内の特定の配列型フィールドを分割する。
  • group: コレクション内のドキュメントをグループ化し、統計的な結果を得るために使用できる。
  • $sort 入力されたドキュメントをソートして出力します。
  • $geoNear: 特定の地理的位置に近い順番のドキュメントを出力します。

<テーブル 表現 説明 インスタンス ドルサム 合計を計算します。 db.mycol.aggregate([{}(group : {_id : "})by_user", num_tutorial : {]) sum:" いいね"}}})) $avg 平均値を算出する db.mycol.aggregate([{}(group : {_id : "})by_user", num_tutorial : {]) avg:" いいね"}}})) 最小値 コレクション内のすべての文書に対応する最小値を取得します。 db.mycol.aggregate([{}(group : {_id : "})by_user", num_tutorial : {]) min:" いいね"}}}]) 最大値 コレクション内の全文書に対応する最大値を取得します。 db.mycol.aggregate([{}(group : {_id : "})by_user", num_tutorial : {}}) 最大値:" いいね"}}}]) プッシュ 結果文書内の配列に値を挿入する。 db.mycol.aggregate([{}(group : {_id : "})by_user", url : {}. push:" url"}}})) $addToSet 結果文書内の配列に値を挿入しますが、コピーは作成しません。 db.mycol.aggregate([{}(group : {_id : "})by_user", url : {}. addToSet:" url"}}]) $first リソースドキュメントの順序に基づき、最初のドキュメントデータを取得します。 db.mycol.aggregate([{}(group : {_id : "})by_user", first_url : {]) first:" url"}}]) $last リソースドキュメントのソートに従って、最後のドキュメントデータを取得する db.mycol.aggregate([{}(group : {_id : "\)by_user", last_url : {]) last:" url"}}])

クエリーの例

例1

transAmt:取引金額、transType:取引種別、transTime:取引時間、mercNum:加盟店番号。

クエリトランザクション情報、トランザクション商人昨日のトランザクション番号は300以上、トランザクション量の蓄積は300万以上、ここに今よると $match を使用してトランザクション情報をフィルタリングし、その後 $group を加盟店番号でグルーピングし、取引件数のカウントと取引金額の積算を行い、グルーピング結果を取引件数が300件以上、取引金額が300万円以上と一致するかどうかを判定します。

db.getCollection('box_order').aggregate([
  {
    $match: {
                "transTime":{$gte:ISODate("2020-01-03T00:00:00.000Z"),$lt:ISODate("2020-01-10T00:00:00.000Z")},
                "transType":"consume",
                "transStatus":{$in:["tsProcessing","success"]}
               }
  },
  {
    $group: {
                  "_id": "$mercNum",
                  "count": { "$sum": 1},
                  "totalAmt": {"$sum": "$transAmt"}
             }
  },
  {
    $match: {
                  "count": { "$gte": 300},
                  "totalAmt": { "$gte": 3000000}
                }
  }
])

例2

フィールドの説明:cardNo:取引カード番号、transType:取引タイプ、transTime:取引時間、mercNum:加盟店番号

指定されたカード番号で行われた取引の加盟店情報を期間内に問い合わせます。

カード番号と取引時間に従って取引データをチェックアウトし、次に加盟店番号とカード番号の2列のフィールドのみを表示し、加盟店番号とカード番号に従ってグループ化し重複を排除し、次にカード番号に従ってグループ化し、加盟店番号をフィールドとして配列に変換します。

db.getCollection('order_202011').aggregate([
  {
    "$match": {
      "detailInfo.cardNo": {
        "$in": [
          "YtCZ7KhCVG5xerKUg8bzJhVAjW/hWAWj",
          "cQ7QQ0yCVW6LhHtJNVRq2A==",
          "6KDpHmQ9s+0SQAGAUyLJ4A==",
          "cQ7QQ0yCVW7iSegn8uqIfg==",
          "ZEOcXdI4rfvswAz7dQ80hw==",
          "6KDpHmQ9s+2Nz61PPuOamw=="
        ]
      },
      "baseInfo.transTime": {
        "$gte": new Date(2020,10,01),
        "$lt": new Date(2020,10,24)
      }
    }
  },
  {
    "$project": {
      "merchantInfo.mercNum": 1,
      "detailInfo.cardNo": 1
    }
  },
  {
    "$group": {
      "_id": {
        "mercNum": "$merchantInfo.mercNum",
        "cardNo": "$detailInfo.cardNo"
      }
    }
  },
  {
    "$group": {
      "_id": "$_id.cardNo",
      "mercNums": {
        "$push": "$_id.mercNum"
      }
    }
  }
])


例3

指定されたマーチャントとその他の条件に従ってトランザクション情報を照会し、カード番号に従ってグループ化してフィールドのコレクションに組み立て、最後にidをフィルタリングしてcardNos配列のみを保持します。

db.getCollection('box_order_fxq_202104').aggregate([
    {
        "$match": {
            "mercNum": "M15201812030753174730",
			"transTime": {
				"$gte": ISODate("2021-04-17T16:00:00.000Z"),
				"$lt": ISODate("2021-04-18T16:00:00.000Z")
			},
            "mercLevel": {
                "$in": [
                    "C",
                    "D",
                    "E"
                ]
            },
            "payType": "POSPAY",
            "transType": "consume",
            "cardType": "2"
        }
    },
    {
        "$group": {
            "_id": null,
            "cardNos": {
                "$push": "$cardNo" //$addToSet
            }
        }
    },
    {
        "$project":{
            "cardNos":1,"_id":0
        }
    }
])


クエリーの結果です。

<ブロッククオート

{
    cardNos" : [ ]です。
        "n2IwHhfEAJcm6RFsoNPcBVAjW/hWAWj",
        "n2IwHhfEAJcm6RFsoNPcBVAjW/hWAWj"
    ]
}

例4

時間に基づいて取引情報を照会した後、加盟店番号でグループ化し、最初の取引情報をデータフィールドに格納する。(すべてのマーチャントのトランザクション情報が必要な場合は $first から $push )

db.getCollection('order').aggregate([
    {
        "$match": {
            "startTrxTime": {
                "$gte": ISODate("2021-07-20T16:00:00.000Z"),
                "$lt": ISODate("2021-07-21T16:00:00.000Z")
            }
        }
    },
    {
        "$group": {
            "_id": "$subMerchantNo",
            'data':{'$first': '$$ROOT'} //$push
        }
    },
    {
        "$sort": {
            "