2

mongodb 集約フレームワークのパイプラインがどのように機能するかについて、根本的な誤解があるかもしれません。私の期待は、各ステップが前のステップの出力を消費することです。http://media.mongodb.org/zips.jsonで提供されているサンプル コレクションを使用した具体的な例を次に示します。

> db.zipcodes.aggregate({$match:{state:"CA"}});

このような結果を生み出します。

    {
        "city" : "TRUCKEE",
        "loc" : [
            -120.295031,
            39.319321
        ],
        "pop" : 199,
        "state" : "CA",
        "_id" : "96162"
    }

ここまでは順調ですね。次に、次を実行して、上記の投影を取得する別のステップを追加することにしました。

> db.zipcodes.aggregate({
    $match:{state:"CA"}, 
    $project: {city: 1, pop: 1, state: 1}
});

プロジェクションは機能しますが、最初の $match ステップは無視されます。これは元の入力に基づいており、状態が != CA であるドキュメントが含まれています。

    {
        "city" : "THAYNE",
        "pop" : 505,
        "state" : "WY",
        "_id" : "83127"
    }

私の予想は間違っていたのでしょうか、それとも構文の問題を見ずにじっと見つめていたのでしょうか? バージョン 2.2.0 を実行しています。

> db.version();
2.2.0

サンプルクエリは機能しているようです。

前もって感謝します。

4

1 に答える 1

3

それは構文の問題です、あなたはやっています:

db.zips.aggregate({$match:{state:"CA"}, $project: {city: 1, pop: 1, state: 1}})

... 同じドキュメント内に $match と $project の両方のフィールドがあります。集約コマンドは、パイプラインの段階を説明する一連の個別のドキュメントを取ります。

db.zips.aggregate({$match:{state:"CA"}}, {$project: {city: 1, pop: 1, state: 1}})

どうやら、パイプライン ステージに複数のフィールドを配置すると、MongoDB は最後のフィールドのみを使用します。これは、次の開発ブランチで修正されたバグです: https://jira.mongodb.org/browse/SERVER-6861

于 2012-10-29T14:27:48.083 に答える