11

次の例を考えてみましょう。

db.article.aggregate(
  { $group : {
      _id : "$author",
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor : { $sum : "$pageViews" }
  }}
);

これは、作成者フィールドごとにグループ化され、2つのフィールドを計算します。

$ author=FirstName_LastNameの値があります。$ authorでグループ化する代わりに、同じLastNameを共有するすべての作成者でグループ化したいと思います。

'_'の後に一致するすべての文字列でグループ化するために$regexを試しました

$author.match(/_[a-zA-Z0-9]+$/)

db.article.aggregate(
  { $group : {
      _id : "$author".match(/_[a-zA-Z0-9]+$/),
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor : { $sum : "$pageViews" }
  }}
);

also tried the following:

 db.article.aggregate(
  { $group : {
      _id : {$author: {$regex: /_[a-zA-Z0-9]+$/}},
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor : { $sum : "$pageViews" }
  }}
);
4

4 に答える 4

6

実際には、この種の機能を提供するメソッドがないか、それを含む適切なバージョンが見つかりませんでした。それは $regexp では機能しないと思います: http://docs.mongodb.org/manual/reference/operator/regex/それはパターンマッチングのためだけです。

jira に改善要求があります: https://jira.mongodb.org/browse/SERVER-6773

オープン未解決状態です。しかし

github で、このディスカッションを見つけました: https://github.com/mongodb/mongo/pull/336

そして、このコミットを確認すると: https://github.com/nleite/mongo/commit/2dd175a5acda86aaad61f5eb9dab83ee19915709

多かれ少なかれ、あなたが持っている可能性のある方法が含まれています。この改善の状態の要点がよくわかりません.2.2.3では機能していません.

于 2013-02-09T11:16:44.583 に答える
3

集計フレームワークで考えられる回避策は、$project を使用して作成者名を計算することです。ただし、さまざまな名前のサイズを手動でループする必要があるため、ダーティです。

ここでは、'_' 文字の後の部分文字列としてフィールド名を計算し、その可能な位置をそれぞれ試し (これが $cond のチェーンがある理由です)、最初の名前が大きすぎる場合は $author 全体を返すようにフォールバックします。長いです:

http://mongotry.herokuapp.com/#?bookmarkId=52fb5f24a0378802003b4c68

[
{
    "$project": {
        "author": 1,
        "pageViews": 1,
        "name": {
            "$cond": [
                {
                    "$eq": [
                        {
                            "$substr": [
                                "$author",
                                0,
                                1
                            ]
                        },
                        "_"
                    ]
                },
                {
                    "$substr": [
                        "$author",
                        1,
                        999
                    ]
                },
                {
                    "$cond": [
                        {
                            "$eq": [
                                {
                                    "$substr": [
                                        "$author",
                                        1,
                                        1
                                    ]
                                },
                                "_"
                            ]
                        },
                        {
                            "$substr": [
                                "$author",
                                2,
                                999
                            ]
                        },
                        {
                            "$cond": [
                                {
                                    "$eq": [
                                        {
                                            "$substr": [
                                                "$author",
                                                2,
                                                1
                                            ]
                                        },
                                        "_"
                                    ]
                                },
                                {
                                    "$substr": [
                                        "$author",
                                        3,
                                        999
                                    ]
                                },
                                {
                                    "$cond": [
                                        {
                                            "$eq": [
                                                {
                                                    "$substr": [
                                                        "$author",
                                                        3,
                                                        1
                                                    ]
                                                },
                                                "_"
                                            ]
                                        },
                                        {
                                            "$substr": [
                                                "$author",
                                                4,
                                                999
                                            ]
                                        },
                                        {
                                            "$cond": [
                                                {
                                                    "$eq": [
                                                        {
                                                            "$substr": [
                                                                "$author",
                                                                4,
                                                                1
                                                            ]
                                                        },
                                                        "_"
                                                    ]
                                                },
                                                {
                                                    "$substr": [
                                                        "$author",
                                                        5,
                                                        999
                                                    ]
                                                },
                                                "$author"
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
},
{
    "$group": {
        "_id": "$name",
        "viewsPerAuthor": {
            "$sum": "$pageViews"
        }
    }
}
]
于 2014-02-12T14:03:32.950 に答える