sql >> Databasteknik >  >> NoSQL >> MongoDB

Jämför matriser och returnera skillnaden

Det enda som "modifierar" dokumentet som svar är .aggregate() och .mapReduce() , där det förra är det bättre alternativet.

I så fall frågar du efter $setDifference som jämför "uppsättningarna" och returnerar "skillnaden" mellan de två.

Så representerar ett dokument med din array:

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

Kör aggregeringen:

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

Som returnerar:

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

Om du inte vill ha "set" och istället vill tillhandahålla en array som [2,3,4,4] sedan kan du jämföra med $filter och $in istället, om du har MongoDB 3.4 åtminstone:

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

Eller med $filter och $anyElementTrue i tidigare versioner:

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

Där båda skulle återvända:

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

Vilket naturligtvis är "inte ett set" eftersom 4 gavs som indata "två gånger" och returneras därför "två gånger".




  1. Timeout utför SET {Key}, inst:0, mgr:Inaktiv, kö:2, qu=1, qs=1, qc=0, wr=1/1, in=0/0

  2. Massuppdatering av dokument i MongoDB

  3. Hur man skapar en Redis-anslutning med Master och Slave

  4. Hur man uppdaterar och lägger upp flera dokument i MongoDB med C#-drivrutiner