6

私はmongoに保存されたユーザーベースを持っています。ユーザー生年月日を記録できます。ユーザーを年齢別に集計するレポートを実行する必要があります。

これで、ユーザーを生年月日でグループ化するパイプラインができました。ただし、ほとんどの人は 1 月 1 日生まれではないため、正確ではありません。そのため、たとえば 1970 年に生まれたとしても、まだ 43 歳ではない可能性があります。

db.Users.aggregate([
    { $match : { "DateOfBirth" : { $exists : true} } },
    { $project : {"YearOfBirth" : {$year : "$DateOfBirth"} } }, 
    { $group : { _id : "$YearOfBirth", Total : { $sum : 1} } },
    { $sort : { "Total" : -1 } }
])

ユーザーの年齢を正確に計算するために、集計フレームワーク内である種の算術演算を実行できるかどうか知っていますか? または、これは MapReduce のみで可能ですか?

4

2 に答える 2

9

リリースされたばかりの新しい Mongo 2.4 バージョンでは、すべてが可能であり、追加の日付操作 (つまり、「$subtract」) がサポートされているようです。

これが私がそれをした方法です:

db.Users.aggregate([
    { $match : { "DateOfBirth" : { $exists : true} } },
    { $project : {"ageInMillis" : {$subtract : [new Date(), "$DateOfBirth"] } } }, 
    { $project : {"age" : {$divide : ["$ageInMillis", 31558464000] }}},
    // take the floor of the previous number:
    { $project : {"age" : {$subtract : ["$age", {$mod : ["$age",1]}]}}},
    { $group : { _id : "$age", Total : { $sum : 1} } },
    { $sort : { "Total" : -1 } }
])
于 2013-03-22T16:34:54.810 に答える
1

日付を予測するのに十分な dateTime 演算子と数学演算子がありません。ただし、動的クエリを作成することで年齢範囲を作成できる場合があります。

日付範囲を締め切り日として次のように定義します

dt18 = 今日 - 18 dt25 = 今日 - 25 ... dt65 = 今日 - 65

次に、次のように、締め切り日を年齢グループ マーカーとして段階的に使用するネストされた条件文を実行します。

db.folks.save({ "_id" : 1, "bd" : ISODate("2000-02-03T00:00:00Z") });
db.folks.save({ "_id" : 2, "bd" : ISODate("2010-06-07T00:00:00Z") });
db.folks.save({ "_id" : 3, "bd" : ISODate("1990-10-20T00:00:00Z") });
db.folks.save({ "_id" : 4, "bd" : ISODate("1964-09-23T00:00:00Z") });


db.folks.aggregate(
    {
    $project: {
        ageGroup: {
            $cond: [{
                $gt: ["$bd",
                ISODate("1995-03-19")]
            },
            "age0_18",
            {
                $cond: [{
                    $gt: ["$bd",
                    ISODate("1988-03-19")]
                },
                "age18_25",
                "age25_plus"]
            }]
        }
    }
},
{
    $group: {
        _id: "$ageGroup",
        count: {
            $sum: 1
        }
    }
})
于 2013-03-19T17:45:00.683 に答える