1. ホーム
  2. mongodb

[解決済み] MongoDBの$unwind演算子って何?

2022-07-08 01:23:57

質問

これは私がMongoDBを使う最初の日なので、気楽にやってください :)

私は理解することができません $unwind 演算子が理解できないのですが、英語が母国語ではないからでしょうか。

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

プロジェクト演算子は、なんとなくわかるような気がします(まるで SELECT のようなものですね)。でも、それなら $unwind (は、(引用者注) は、すべてのソースドキュメント内の巻き戻し配列の各メンバーに対して一つのドキュメントを返します。 .

これは JOIN ? もしそうなら、どのように $project (の結果はどうなるのでしょうか? _id , author , titletags フィールド) と比較することができます。 tags の配列と比較できますか?

ノート : MongoDB のウェブサイトから引用したものです。 tags の配列の構造を知りません。タグ名の単純な配列だと思うのですが。

どのように解決するのですか?

まず最初に、MongoDBへようこそ!

MongoDBはデータストレージにquot;NoSQL;のアプローチを採用しているので、selectsやjoinなどの考えは捨ててください。データを保存する方法は、ドキュメントとコレクションの形式であり、ストレージの場所にデータを追加したり取得したりするための動的な手段を可能にします。

とはいえ、$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が行うことは、各要素のドキュメントを剥がし、その結果のドキュメントを返すということです。 これを古典的なアプローチで考えると、"for each item in the tags array, return a document with that item" と同じになります。

したがって、以下を実行した結果です。

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つへのあなたの進出を、幸運を祈ります。