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

Mongo / MongooseAggregation-$redactおよび$condの問題

    $facetを試すことができます $addFieldsを使用 3.4での並列集計の場合 バージョン。

    これにより、全体的な複雑さが軽減され、同時に独自の一致する入力を使用してグループ化を実行できます。

    次のコードは、リクエストオブジェクトに基づいて動的に集計パイプラインを構築します。

    // Sample request
    var request = {
      "name":"RINGGO",
      "year": 2017,
      "month":3,
      "week":12
    };
    
    // Build initial match document on name
    
    var match1 = {
      name: request["name"]
    };
    
    // Build project & facet document for date based aggregation
    
    var addFields = {};
    var facet = {};
    
    // Add year followed by year facet
    
    if (request["year"]) {
        addFields["year"] = { "$year": "$date" },
        facet["Yearly"] = 
          [
            {
              "$match":{ "year": request["year"] }
            },
            {
              "$group": {
                "_id": {
                  "name": "$name",
                  "year": "$year"
                },
                "spend": { "$push":"$amount" },
                "total": { "$sum": "$amount" }
            }
          }
        ];
    }
    
    // Add month followed by month facet
    
    if (request["month"]) {
        addFields["month"] = { "$month": "$date" };
        facet["Monthly"] = 
          [
            {
              "$match":{ "month": request["month"] }
            },
            {
              "$group": {
                "_id": {
                  "name": "$name",
                  "month": "$month"
                },
                "spend": { "$push":"$amount" },
                "total": { "$sum": "$amount" }
             }
          }
        ];
    }
    
    // Add week followed by week facet
    
    if (request["week"]) {
        addFields["week"] = { "$week": "$date" };
        facet["Weekly"] = 
          [
            {
              "$match":{ "week": request["week"] }
            },
            {
              "$group": {
                "_id": {
                  "name": "$name",
                  "week": "$week"
                },
                "spend": { "$push":"$amount" },
                "total": { "$sum": "$amount" }
             }
          }
        ];
    }
    
    // Use aggregate builder
    
    statements.aggregate()
            .match(match1)
            .append({"$addFields": addFields}) // No addFields stage in mongoose builder
            .facet(facet)
            .exec(function(err, data) {});
    

    name/year/month/weekのMongoShellクエリ 基準。

    db.statements.aggregate({
        '$match': {
            name: 'RINGGO'
        }
    }, {
        '$addFields': {
            year: {
                '$year': '$date'
            },
            month: {
                '$month': '$date'
            },
            week: {
                '$week': '$date'
            }
        }
    }, {
        '$facet': {
            Yearly: [{
                    '$match': {
                        year: 2017
                    }
                },
                {
                    '$group': {
                        _id: {
                            name: '$name',
                            year: '$year'
                        },
                        spend: {
                            '$push': '$amount'
                        },
                        total: {
                            '$sum': '$amount'
                        }
                    }
                }
            ],
            Monthly: [{
                    '$match': {
                        month: 3
                    }
                },
                {
                    '$group': {
                        _id: {
                            name: '$name',
                            month: '$month'
                        },
                        spend: {
                            '$push': '$amount'
                        },
                        total: {
                            '$sum': '$amount'
                        }
                    }
                }
            ],
            Weekly: [{
                    '$match': {
                        week: 12
                    }
                },
                {
                    '$group': {
                        _id: {
                            name: '$name',
                            week: '$week'
                        },
                        spend: {
                            '$push': '$amount'
                        },
                        total: {
                            '$sum': '$amount'
                        }
                    }
                }
            ]
        }
    })
    

    サンプル応答

        {
        "Yearly": [{
            "_id": {
                "name": "RINGGO",
                "year": 2017
            },
            "spend": [-3.3, -6.3, -3.3, -6.3, -3.3, -3.3],
            "total": -25.799999999999997
        }],
        "Monthly": [{
            "_id": {
                "name": "RINGGO",
                "month": 3
            },
            "spend": [-3.3, -6.3, -3.3, -6.3, -3.3, -3.3],
            "total": -25.799999999999997
        }],
        "Weekly": [{
            "_id": {
                "name": "RINGGO",
                "week": 12
            },
            "spend": [-6.3, -3.3],
            "total": -9.6
        }]
    }
    

    Year/Monthに対して同様の集計を実行できます およびYear 入力値。

    これは$groupで発生します 1ここで​​$week 集計は、2つの日付[15、16]の金額をそれぞれ11週目にロールアップし、他の2つの日付[22、23]の金額を12週後にロールアップして、MonthySpendsに合計として表示します。 。




    1. php7mongoクエリfindOneの問題

    2. マングースは複数のドキュメントを更新しても何も更新されません

    3. mongoosejsでAllを見つける方法は?

    4. MongoDbで友達の友達を見つけるためのグラフデータベースとして使用する