sql >> データベース >  >> NoSQL >> MongoDB

子の親への参照に基づいてドキュメントを検索する

    実際、これを行うための「最良の」方法は、 .aggregate()を使用することです。 および $ lookup データを「結合」し、一致条件で「フィルタリング」します。 .populate()

    MovieModel.aggregate([
      { "$match": { "m_title": m_title } },
      { "$lookup": {
        "from": RankMovieModel.collection.name,
        "localField": "_id",
        "foreignField": "movie",
        "as": "rankings"
      }}
    ])
    

    ランキングが「たくさん」ある場合は、<を使用するのが最適です。 code> $ unwind 、関連する「ランキング」アイテムごとにドキュメントを作成します:

    MovieModel.aggregate([
      { "$match": { "m_title": m_title } },
      { "$lookup": {
        "from": RankMovieModel.collection.name,
        "localField": "_id",
        "foreignField": "movie",
        "as": "rankings"
      }},
      { "$unwind": "$rankings" }
    ])
    

    16MBのBSON制限に違反しないように、MongoDBがドキュメントの「結合」を処理する方法についても特別な処理があります。したがって、実際には、この特別なことは、 $ unwind> $ lookupの直後に続きます パイプラインステージ:

        {
            "$lookup" : {
                "from" : "rankmovies",
                "as" : "rankings",
                "localField" : "_id",
                "foreignField" : "movie",
                "unwinding" : {
                    "preserveNullAndEmptyArrays" : false
                }
            }
        }
    

    したがって、 $ unwind 実際には「消えて」、代わりに $ lookup これが「1つの」操作であるかのようにそれ自体。そうすれば、親ドキュメント内に直接「配列」を作成しないため、多くの「関連する」アイテムがある極端な場合にサイズが16MBを超えることになります。

    $ lookup MongoDB3.2最小値 )次に、 .populate()で「仮想」を使用できます。 代わりに(最低でもMongoose4.5.0が必要です )。ただし、これは実際には「2」を実行することに注意してください サーバーへのクエリ:

    まず、「仮想」をスキーマに追加します。

    movieSchema.virtual("rankings",{
      "ref": "Movie",
      "localField": "_id",
      "foreignField": "movie"
    });
    

    次に、 .populate()を使用してクエリを発行します。

    MovieModel.find({ "m_title": m_title })
      .populate('rankings')
      .exec()
    



    1. MongoDB $ lookup Objectidは空の配列を取得しますか?

    2. MongoDBでインデックスが非表示になっているかどうかを確認する方法

    3. mongoクエリ-プロパティは存在しますか?

    4. Mongotemplate-より大きい(gt)またはより小さい(lt)演算子に従ってObjectIdを照会します