130

MongoDB を使うのはこれが初めてなので、気楽に話してください :)

$unwind英語が母国語ではないためか、演算子がわかりません。

db.article.aggregate(
    { $project : {
        author : 1 ,
        title : 1 ,
        tags : 1
    }},
    { $unwind : "$tags" }
);

プロジェクトのオペレーターは、私が理解できるものだと思います (みたいな感じSELECTですよね)。しかし、$unwind(引用)は、すべてのソース ドキュメント内の巻き戻された配列のすべてのメンバーに対して 1 つのドキュメントを返します

これはのようなものJOINですか?はいの場合、$project( _idauthortitleおよびフィールドを使用して) の結果を配列tagsと比較するにはどうすればよいですか?tags

tags: MongoDB Web サイトから例を取得しましたが、配列の構造がわかりません。タグ名の単純な配列だと思います。

4

5 に答える 5

310

まず、MongoDB へようこそ!

覚えておくべきことは、MongoDB はデータ ストレージに "NoSQL" アプローチを採用しているため、選択、結合などの考えを忘れてしまうことです。データを保存する方法は、ドキュメントとコレクションの形式であるため、保存場所からデータを動的に追加および取得できます。

そうは言っても、$unwind パラメーターの背後にある概念を理解するには、まず、引用しようとしているユース ケースが何を言っているのかを理解する必要があります。mongodb.orgのサンプル ドキュメントは次のとおりです。

{
 title : "this is my title" ,
 author : "bob" ,
 posted : new Date () ,
 pageViews : 5 ,
 tags : [ "fun" , "good" , "fun" ] ,
 comments : [
             { author :"joe" , text : "this is cool" } ,
             { author :"sam" , text : "this is bad" }
 ],
 other : { foo : 5 }
}

タグが実際には 3 つの項目の配列であることに注意してください。この場合は、"fun"、"good"、"fun" です。

$unwind が行うことは、要素ごとにドキュメントを剥がして、その結果のドキュメントを返すことです。これを従来のアプローチで考えると、「tags 配列内の各アイテムについて、そのアイテムのみを含むドキュメントを返す」ことと同等になります。

したがって、次を実行した結果は次のとおりです。

db.article.aggregate(
    { $project : {
        author : 1 ,
        title : 1 ,
        tags : 1
    }},
    { $unwind : "$tags" }
);

次のドキュメントを返します。

{
     "result" : [
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "fun"
             },
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "good"
             },
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "fun"
             }
     ],
     "OK" : 1
}

結果配列で変更されるのは、タグ値で返されるものだけであることに注意してください。これがどのように機能するかについて追加の参照が必要な場合は、ここにリンクを含めました。これが役に立てば幸いです。これまでに出会った中で最高の NoSQL システムの 1 つに足を踏み入れてください。

于 2013-05-08T19:32:22.577 に答える
53

$unwind配列要素ごとに 1 回、パイプライン内の各ドキュメントを複製します。

したがって、入力パイプラインに の 2 つの要素を持つ 1 つの記事ドキュメントが含まれている場合tags{$unwind: '$tags'}は、フィールドを除いて同じ 2 つの記事ドキュメントにパイプラインを変換しtagsます。最初のドキュメントにtagsは元のドキュメントの配列の最初の要素が含まれ、2 番目のドキュメントにtagsは 2 番目の要素が含まれます。

于 2013-05-08T19:17:18.060 に答える