sql >> Database >  >> NoSQL >> MongoDB

MongoDB $mod

In MongoDB, de $mod aggregatiepijplijnoperator deelt het ene getal door het andere en geeft de rest terug.

Om $mod te gebruiken , geef de twee getallen in een array door. De $mod operator deelt het eerste getal door het tweede getal en geeft de rest terug. Met andere woorden, het eerste getal is het deeltal en het tweede getal is de deler.

De argumenten kunnen elke geldige uitdrukking zijn, zolang ze maar worden omgezet in getallen.

Voorbeeld

Stel dat we een verzameling hebben met de naam data met de volgende documenten:

{ "_id" : 1, "a" : 10, "b" : 2 }
{ "_id" : 2, "a" : 10, "b" : 3 }
{ "_id" : 3, "a" : 10.5, "b" : 2 }

We kunnen de $mod . gebruiken operator binnen een aggregatiepijplijn om de a . te verdelen veld door de b veld, en retourneer de rest:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     { $project: { 
        _id: 0,
        a: 1,
        b: 1,
        result: { $mod: [ "$a", "$b" ] } } 
         }
   ]
)

Resultaat:

{ "a" : 10, "b" : 2, "result" : 0 }
{ "a" : 10, "b" : 3, "result" : 1 }
{ "a" : 10.5, "b" : 2, "result" : 0.5 }

Met andere woorden, we krijgen a modulo b .

Als we b . willen krijgen modulo a , zouden we ze moeten omwisselen.

Voorbeeld:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     { $project: { 
        _id: 0,
        a: 1,
        b: 1,
        result: { $mod: [ "$b", "$a" ] } } 
         }
   ]
)

Resultaat:

{ "a" : 10, "b" : 2, "result" : 2 }
{ "a" : 10, "b" : 3, "result" : 3 }
{ "a" : 10.5, "b" : 2, "result" : 2 }

Negatieve getallen

Stel dat we de volgende documenten aan onze collectie toevoegen:

{ "_id" : 4, "a" : -10, "b" : 3 }
{ "_id" : 5, "a" : 10, "b" : -3 }
{ "_id" : 6, "a" : -10, "b" : -3 }

Deze omvatten negatieve getallen. Maar dat is geen probleem, want negatieve getallen zijn nog steeds getallen, en we kunnen zeker de modulo krijgen als we met negatieve getallen werken.

Voorbeeld:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5, 6 ] } } },
     { $project: { 
        _id: 0,
        a: 1,
        b: 1,
        result: { $mod: [ "$a", "$b" ] } } 
         }
   ]
)

Resultaat:

{ "a" : -10, "b" : 3, "result" : -1 }
{ "a" : 10, "b" : -3, "result" : 1 }
{ "a" : -10, "b" : -3, "result" : -1 }

Onjuist gegevenstype

De argumenten geleverd aan $mod kan elke geldige uitdrukking zijn, zolang ze maar worden omgezet in getallen.

Stel dat we het volgende document hebben:

{ "_id" : 7, "a" : "Ten", "b" : 2 }

En we passen $mod toe naar dat document:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     { $project: { 
        _id: 0,
        a: 1,
        b: 1,
        result: { $mod: [ "$a", "$b" ] } } 
         }
   ]
)

Resultaat:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$mod only supports numeric types, not string and double",
	"code" : 16611,
	"codeName" : "Location16611"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

De fout geeft aan dat $mod only supports numeric types .

Null-waarden

null opgeven voor elk van de argumenten retourneert null .

Stel dat we de volgende documenten hebben:

{ "_id" : 8, "a" : 10, "b" : null }
{ "_id" : 9, "a" : null, "b" : 10 }
{ "_id" : 10, "a" : null, "b" : null }

En we passen $mod toe naar die documenten:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 8, 9, 10 ] } } },
     { $project: { 
        _id: 0,
        a: 1,
        b: 1,
        result: { $mod: [ "$a", "$b" ] } } 
         }
   ]
)

Resultaat:

{ "a" : 10, "b" : null, "result" : null }
{ "a" : null, "b" : 10, "result" : null }
{ "a" : null, "b" : null, "result" : null }

Ontbrekende velden

Ontbrekende velden retourneren null .

Stel dat we de volgende documenten hebben:

{ "_id" : 11, "a" : 10 }
{ "_id" : 12, "b" : 2 }
{ "_id" : 13 }

Pas $mod toe :

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 11, 12, 13 ] } } },
     { $project: { 
        _id: 0,
        a: 1,
        b: 1,
        result: { $mod: [ "$a", "$b" ] } } 
         }
   ]
)

Resultaat:

{ "a" : 10, "result" : null }
{ "b" : 2, "result" : null }
{ "result" : null }

Voeg uw eigen nummer toe

U bent niet noodzakelijkerwijs beperkt tot alleen de cijfers in de documenten. U kunt uw eigen getallen gebruiken als u een veld door een vast bedrag moet delen.

Voorbeeld:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     { $project: { 
        _id: 0,
        a: 1,
        b: 1,
        result: { $mod: [ "$a", 5.2 ] } } 
         }
   ]
)

Resultaat:

{ "a" : 10, "b" : 2, "result" : 4.8 }
{ "a" : 10, "b" : 3, "result" : 4.8 }
{ "a" : 10.5, "b" : 2, "result" : 0.09999999999999964 }

  1. Redis `SCAN`:hoe een evenwicht te bewaren tussen nieuwe sleutels die kunnen overeenkomen en zorgen voor een uiteindelijk resultaat binnen een redelijke tijd?

  2. Verschil tussen MongoDB en Mongoose

  3. Afbeeldingen opslaan in een MongoDB-database

  4. ioredis Sleutel met bijpassend patroon