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

条件付きのMongodb集計ルックアップ

    まず、all_category_idです。 、category_idではありません 。次に、記事をリンクしません。すべてのドキュメントのarticle_categoryはまったく同じになります。 配列。最後に、カテゴリが一致しない記事を除外することをお勧めします。条件付きパイプラインは次のようになります。

    db.article.aggregate([
      { $match: {
          title: { $regex: /example/ }
      } },
      { $lookup: {
        from: "article_category",
        let: {
          article_id: "$article_id"
        },
        pipeline: [
          { $match: {
              $expr: { $and: [
                  { $in: [ 8, "$all_category_id" ] },
                  { $eq: [ "$article_id", "$$article_id" ] }
              ] }
          } }
        ],
        as: "article_category"
      } },
      { $match: {
        $expr: { $gt: [
          { $size: "$article_category"},
          0
        ] }
      } }
    ] )
    

    更新:

    article_idと一致しない場合 、$lookup 結果は同じarticle_categoryになります すべての記事に配列します。

    article_categoryとしましょう コレクションには別のドキュメントがあります:

    {
      "article_id": 0,
      "all_category_id": [5,8,10]
    }
    

    { $eq: [ "$article_id", "$$article_id" ] } パイプラインで、結果のarticle_category

    です
    [ 
      { 
        "article_id" : 2015110920343902, 
        "all_category_id" : [ 5, 8, 10 ] 
      } 
    ]
    

    なし:

    [ 
      { 
        "article_id" : 2015110920343902, 
        "all_category_id" : [ 5, 8, 10 ] 
      },
      {
        "article_id": 0,
        "all_category_id": [ 5, 8, 10 ]
      }
    ]
    

    後者が必要な場合は、リクエストを見つけるのがはるかに簡単になります:

    db.article.find({ title: { $regex: /example/ } })
    

    および

    db.article_category.find({ all_category_id: 8 })
    


    1. MongoDB $ indexOfCP

    2. 複数のノードとsocket.io-redisを持つsocket.ioでソケットが生きている(接続されている)ことを確認する方法

    3. MongoDB:フィールドがnullまたは設定されていないレコードをクエリする方法は?

    4. マングースの再帰的な人口