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

配列を比較して違いを返す

    応答としてドキュメントを「変更」するのは、.aggregate()だけです。 および.mapReduce() 、前者がより良いオプションです。

    その場合、あなたは$setDifferenceを求めています これは「セット」を比較し、2つの間の「違い」を返します。

    したがって、配列でドキュメントを表す:

    db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
    

    集計を実行します:

    db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
    

    どちらが返されますか:

    { "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
    

    「セット」が必要ではなく、代わりに[2,3,4,4]のような配列を提供したい場合 次に、$filterと比較できます および$in 代わりに、少なくともMongoDB 3.4を使用している場合:

    db.collection.aggregate([
      { "$project": {
        "c": {
          "$filter": {
            "input": [2,3,4,4],
            "as": "a",
            "cond": {
              "$not": { "$in": [ "$$a", "$b" ]  }
            }
          }
        }   
      }}
    ])
    

    または$filter および$anyElementTrue 以前のバージョン:

    db.collection.aggregate([
      { "$project": {
        "c": {
          "$filter": {
            "input": [2,3,4,4],
            "as": "a",
            "cond": {
              "$not": {
                "$anyElementTrue": {
                  "$map": {
                    "input": "$b",
                    "as": "b",
                    "in": {
                      "$eq": [ "$$a", "$$b" ]    
                    }
                  }    
                }
              }
            }    
          }
        }    
      }}
    ])
    

    両方が戻る場所:

    { "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
    

    4以降、これはもちろん「セットではありません」 入力として「2回」提供されたため、「2回」も返されます。




    1. ジェダイ、ジェダイ接続を取得できません:プールからリソースを取得できません

    2. Redisを使用した通知およびニュースエリア

    3. redis-trib.rbを使用してクラスターを作成するときに接続エラーが発生しますか?

    4. リレーショナルデータベースの代わりにNoSQLデータベースを使用する必要があるのはいつですか?同じサイトで両方を使用しても大丈夫ですか?