sql >> Databáze >  >> NoSQL >> MongoDB

Porovnejte pole a vraťte rozdíl

Jediné věci, které „upravují“ dokument v odpovědi, jsou .aggregate() a .mapReduce() , kde první možnost je lepší.

V tom případě žádáte o $setDifference který porovná "množiny" a vrátí "rozdíl" mezi nimi.

Takže reprezentující dokument s vaším polem:

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

Spusťte agregaci:

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

Což vrátí:

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

Pokud nechcete "sady" a místo toho chcete dodat pole jako [2,3,4,4] pak můžete porovnat s $filter a $in místo toho, pokud máte MongoDB 3.4 alespoň:

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

Nebo pomocí $filter a $anyElementTrue v dřívějších verzích:

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" ]    
                }
              }    
            }
          }
        }    
      }
    }    
  }}
])

Kam by se oba vrátili:

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

Což od 4 samozřejmě "není sada". byl poskytnut jako vstup "dvakrát" a je proto také vrácen "dvakrát".




  1. Top 10 funkcí MongoDB Atlas

  2. Dotaz na hledání uzlu mongoose ve smyčce nefunguje

  3. Čtečka Mongo C# JSON očekávala hodnotu, ale našla „replSetGetStatus“

  4. Úrovně nejistoty MongoDB a jak se jim vyhnout