2

グループの使用中にパイプラインを (変更なしで) 後続のパイプライン アグリゲーターに渡すには、いくつかの値が必要です。

たとえば、私の入力が

{ "_id" : 1, "タグ" : [ "a", "b", "b", "c" ], "テキスト" : "a" }, { "_id" : 2, "タグ" : [ "a", "c" ], "text" : "b" }

そして、私は出力が好きです

{ _id: 1, タグ: [a,b,c], テキスト: a} , { _id: 2, タグ: [a,c], テキスト: b}

巻き戻しとグループ化を行い、$addToSet を実行して重複を削除しました。私の質問は、どうやって作るのですか

textそのまま出力に表示されます。テキストキーと値はこのパイプラインを通過する必要がありますが、アキュムレータを使用する必要があります

これまでにこのコードを試しました

使用テスト

var unwind = { $unwind : "$tags"};

var group = { $group : { _id : "$_id" , tags : { $addToSet : "$tags" } , text : { $first : "$text" }}};

db.test.aggregate(アンワインド、グループ)

それは正常に動作しますが、それは $first の意図ではなく、並べ替えで使用することをお勧めします。これを行う正しい方法は何ですか?

4

2 に答える 2

1

これを使っても問題ありません$firsttext別の方法として、 に追加することもできますが、パイプラインの最後に a を追加して から戻す_id必要があるため、これはほとんど良い方法ではありません。$project_id

SQL の group by を使用する場合も、同様のやや厄介なことを行う必要があります。

于 2013-09-20T16:20:51.027 に答える
0

ドキュメント ページで指定されているように、フィールド以外のすべてのフィールド_idは、アキュムレータを使用する必要があります。問題は、MongoDB には、グループ化するすべてのドキュメントでそのフィールドの値が同じになることを知る方法がないため、を使用してパイプラインを介して値を「渡す」ことが何を意味するのかが不明であることです。アキュムレータを使用して、そのフィールドに必要な値を選択する必要があります。$group$group$group

于 2013-09-20T16:22:27.580 に答える