1

私はMongoDBの初心者なので、この質問に明らかな答えがある場合はご容赦ください...

環境:

MongoDB docsの例に従って、map-reduce を使用して階層的な集約を実装しました。この例では、「複合」_idフィールドを map-reduce キーとして使用して、次のような集約ドキュメントを生成します...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

これはすべて順調です。私の特定のユースケースでは、いくつかの同様のキーの値が各mapステップで発行される必要があります。例えば...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), hobby: "wizardry" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), gender: "male" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

(値は同じですが、_idキーが少し異なります。)

これもまたうまい。

質問:

ここで、いくつかの異なる複合フィールドを持つドキュメントを含む階層コレクション (ビュー) を集約したいと思いますが、 ingフィールド_idを持つドキュメントのみを集約します。たとえば、 typeを持つドキュメントのみ、またはofを持つドキュメントのみを集計したいと思います。$match_id{u: String, d: Date, hobby: String}_id_id{u: String, d: Date}

$exists演算子を使用して、許可するフィールドと許可しないフィールドを制限できることは承知していますが、それぞれ(潜在的に多数)_idに対して個別の集計を作成する必要はありません。_id

$matchドキュメントを集約内の特定のフィールドを含む (または含まない) ドキュメントにプログラムで制限する簡単な方法はありますか?

4

1 に答える 1

1

この問題に対処する最善の方法は、データを別の方法で保存することだと思います。あなたの「_id」のようなものはキーとして任意の値を持ち、それは避けるべきものです。私はおそらくドキュメントを次のように保存します:

{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: hobby, value: "wizardry" }
}
{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: gender, value: "male" },
}

そして、タイプごとに異なるマッチを作成する必要がなくても、マッチは簡単です。

于 2013-07-24T10:32:58.477 に答える