sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $mod

I MongoDB, $mod aggregeringspipelineoperatör delar ett tal med ett annat och returnerar resten.

För att använda $mod , skicka de två talen i en array. $mod operatören delar det första talet med det andra talet och returnerar resten. Med andra ord, den första siffran är utdelningen och den andra siffran är divisorn.

Argumenten kan vara vilket giltigt uttryck som helst så länge de löser sig till siffror.

Exempel

Anta att vi har en samling som heter data med följande dokument:

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

Vi kan använda $mod operatör inom en aggregeringspipeline för att dela a fältet med b och returnera resten:

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

Resultat:

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

Med andra ord får vi a modulo b .

Om vi ​​vill få b modulo a , vi skulle behöva byta runt dem.

Exempel:

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

Resultat:

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

Negativa tal

Anta att vi lägger till följande dokument i vår samling:

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

Dessa inkluderar negativa siffror. Men det är inte ett problem, eftersom negativa tal fortfarande är tal, och vi kan säkert få modulo när vi arbetar med negativa tal.

Exempel:

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

Resultat:

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

Fel datatyp

Argumenten som tillhandahålls till $mod kan vara vilket giltigt uttryck som helst, så länge de löser sig till tal.

Anta att vi har följande dokument:

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

Och vi tillämpar $mod till det dokumentet:

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

Resultat:

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

Felet säger att $mod only supports numeric types .

Nullvärden

Tillhandahåller null för något av argumenten returnerar null .

Anta att vi har följande dokument:

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

Och vi tillämpar $mod till dessa dokument:

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

Resultat:

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

Fält saknas

Saknade fält returnerar null .

Anta att vi har följande dokument:

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

Använd $mod :

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

Resultat:

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

Lägg till ditt eget nummer

Du är inte nödvändigtvis begränsad till bara siffrorna i dokumentet/dokumenten. Du kan använda dina egna nummer om du behöver dela ett fält med ett fast belopp.

Exempel:

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

Resultat:

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

  1. Använder operatorn $slice för att få det sista elementet i arrayen

  2. $addFields när ingen $match hittades

  3. MongoDB $round vs $trunc:Vad är skillnaden?

  4. En guide till MongoDB-distribution och underhåll med Puppet:Del 1