I MongoDB, $range
aggregeringspipeline-operatören returnerar en genererad sekvens av tal i en array.
Den här nummersekvensen är baserad på de indata du anger.
Syntax
Syntaxen ser ut så här:
{ $range: [ <start>, <end>, <non-zero step> ] }
Där
är slutet på sekvensen. Var och en av dessa kan vara vilket giltigt uttryck som helst som löser sig till ett heltal.
Exempel
Anta att vi har en samling som heter range
med följande dokument:
{ "_id" : 1, "start" : 0, "end" : 5 } { "_id" : 2, "start" : 1, "end" : 5 }
Vi kan använda $range
operatorn för att returnera en array baserat på värdena i dessa dokument.
db.range.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end" ] }
}
}
]
)
Resultat:
{ "start" : 0, "end" : 5, "result" : [ 0, 1, 2, 3, 4 ] } { "start" : 1, "end" : 5, "result" : [ 1, 2, 3, 4 ] }
I det här fallet tillhandahöll vi inte ett tredje argument, och därför $range
använder sitt standardstegvärde på 1. Därför ökar arrayelementen med 1.
Lägg till en explicit ökning
Vi kan lägga till ett tredje argument för att explicit specificera hur mycket varje arrayelement ska öka med.
Anta att vår samling innehåller följande dokument:
{ "_id" : 3, "start" : 0, "end" : 5, "step" : 1 } { "_id" : 4, "start" : 0, "end" : 10, "step" : 2 } { "_id" : 5, "start" : 1, "end" : 10, "step" : 2 } { "_id" : 6, "start" : 100, "end" : 150, "step" : 10 }
Dessa dokument har ett steg
fältet, och så kan vi använda det fältet för det ökande värdet för respektive dokument.
Låt oss nu tillämpa $range
till dessa dokument och inkludera steget
fältet som ett tredje argument:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 3, 4, 5, 6 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
step: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Resultat:
{ "start" : 0, "end" : 5, "step" : 1, "result" : [ 0, 1, 2, 3, 4 ] } { "start" : 0, "end" : 10, "step" : 2, "result" : [ 0, 2, 4, 6, 8 ] } { "start" : 1, "end" : 10, "step" : 2, "result" : [ 1, 3, 5, 7, 9 ] } { "start" : 100, "end" : 150, "step" : 10, "result" : [ 100, 110, 120, 130, 140 ] }
Negativa stegvärden
Steget kan vara ett negativt värde, även om detta måste göras i samband med att dekrementera från en högre start
nummer till en lägre ände
siffra.
Låt oss lägga till några fler dokument till vår samling:
{ "_id" : 7, "start" : 0, "end" : 5, "step" : -1 } { "_id" : 8, "start" : 5, "end" : 0, "step" : -1 } { "_id" : 9, "start" : 0, "end" : -5, "step" : -1 }
Låt oss nu tillämpa $range
till dessa dokument:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 7, 8, 9 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
step: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Resultat:
{ "start" : 0, "end" : 5, "step" : -1, "result" : [ ] } { "start" : 5, "end" : 0, "step" : -1, "result" : [ 5, 4, 3, 2, 1 ] } { "start" : 0, "end" : -5, "step" : -1, "result" : [ 0, -1, -2, -3, -4 ] }
Vi kan se att det första dokumentet returnerade en tom array eftersom det negativa stegvärdet ligger utanför intervallet som tillhandahålls av start
och slut
fält.
De efterföljande dokumenten producerade dock ett minskande värdeintervall.
När steget är noll
Stegvärdet måste vara ett heltal som inte är noll. Ange steget 0
returnerar ett fel.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 10, "start" : 1, "end" : 5, "step" : 0 }
Det här är vad som händer när vi tillämpar $range
till det dokumentet:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 10 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a non-zero step value", "code" : 34449, "codeName" : "Location34449" } : 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
Felmeddelandet berättar uttryckligen för oss att $range kräver ett stegvärde som inte är noll
.
Nullsteg
Steget kan inte vara null
antingen.
Anta att vi har följande dokument:
{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }
Och vi tillämpar $range
till det:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 11 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a numeric step value, found value of type:null", "code" : 34447, "codeName" : "Location34447" } : 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
Detta talar om för oss att $range kräver ett numeriskt stegvärde, hittat värde av typen:null
.
Nullintervall
Om start
och/eller slut
fälten är null
, då returneras ett fel.
Anta att vi har följande dokument:
{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }
Och tillämpa $range
till det:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 11 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a numeric starting value, found value of type: null", "code" : 34443, "codeName" : "Location34443" } : 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
Detta talar om för oss att $range kräver ett numeriskt startvärde, hittat värde av typen:null
.
Ett liknande meddelande skulle visas om slutvärdet var null.
Här är ett dokument med null
slutvärde:
{ "_id" : 13, "start" : 1, "end" : null, "step" : 1 }
Låt oss tillämpa $range
:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 13 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a numeric ending value, found value of type: null", "code" : 34445, "codeName" : "Location34445" } : 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
Den här gången berättar det för oss att $range kräver ett numeriskt slutvärde, hittat värde av typen:null
.