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

MongoDB:ネストされた配列フィルタリングを使用したfindおよびfindOne

    TL; DR これは乗り物の地獄であることが判明したので。 $elemMatchを試しました 、$redactを試しました ($$CURRENTと$$ROOTでも)$mapを試しました 、アグリゲーションフレームワークを試しました。$projectを試しました。 。

    ここですべてを読むことができます:https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/

    TL; DR

    解決策は、集計フレームワークを使用して配列をフィルタリングし、commentsプロパティを結果でオーバーライドすることであるようです。これは思ったよりも簡単です:

    db.getCollection('posts').aggregate(
        {$match: {"author.id": authorId}},
        {$addFields : {"comments":{$filter:{ // We override the existing field!
            input: "$comments",
            as: "comment",
            cond: {$eq: ["$$comment.state.deleted", false]}
        }}}}
    );
    

    結果:

    {
      "author": {},
      "message": "This is post1",
      "comments": [
        {
          "message": "Im number 1!!!",
          "state": {
            "deleted": false
          }
        },
        {
          "message": "tHIS IS GREAT!",
          "state": {
            "deleted": false
          }
        },
        {
          "message": "I can type better than you guys",
          "state": {
            "deleted": false
          }
        }
      ]
    },
    {
      "author": {},
      "message": "This is post 2",
      "comments": [
        {
          "message": "I wanna have your children",
          "state": {
            "deleted": false
          }
        }
      ]
    }
    



    1. 異なるマシンでのRedisレプリケーションの使用(マルチマスター)

    2. RedisデータベースTTL

    3. Ubuntu18.04でMySQLマスタースレーブレプリケーションをセットアップする方法

    4. MongoDB挿入パフォーマンスを改善する方法