sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB sort()

I MongoDB, cursor.sort() metod anger i vilken ordning frågan returnerar matchande dokument.

sort() metod accepterar ett dokument som anger fältet som ska sorteras och sorteringsordningen. Sorteringsordningen kan vara antingen 1 för stigande eller -1 för nedstigning.

Du kan också ange { $meta: "textScore" } när du gör $text sökningar, för att sortera efter den beräknade textScore metadata i fallande ordning.

Exempeldata

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

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }

Sortera i stigande ordning

För att sortera i stigande ordning använder vi 1 för sorteringsordningen.

Nedan är ett exempel på en fråga som använder $sort operatör för att sortera samlingen efter weight fältet i stigande ordning.

db.pets.find().sort({ weight: 1 })

Resultat:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }

Sortera i fallande ordning

För att sortera i fallande ordning använder vi -1 för sorteringsordningen.

db.pets.find().sort({ weight: -1 })

Resultat:

{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Sortera efter flera fält

För att sortera efter mer än ett fält, separera varje fält/sorteringsordningskombo med ett kommatecken.

Exempel

db.pets.find().sort({ type: 1, weight: -1, _id: 1 })

Resultat:

{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }

I det här exemplet sorterade vi efter type fältet i stigande ordning först, sedan efter weight fältet i fallande ordning, sedan efter _id fältet i stigande ordning.

Detta innebär att om det finns flera husdjur av samma typ, sorteras dessa husdjur efter deras weight i fallande ordning. Om det finns flera husdjur med både samma typ och vikt, sorteras dessa husdjur efter _id fältet i stigande ordning. Om vi ​​inte hade inkluderat _id fältet i sorteringsprocessen, kan dessa husdjur av samma typ och vikt dyka upp i valfri ordning. Detta är sant varje gång vi kör frågan. Utan att ha ett sorteringsfält på ett unikt fält (som _id). fältet), skulle det vara fullt möjligt (även troligt) att resultaten skulle komma tillbaka i en annan ordning varje gång frågan kördes.

Sortera olika typer

När man jämför värden för olika BSON-typer använder MongoDB följande jämförelseordning, från lägsta till högsta:

  1. MinKey (intern typ)
  2. Null
  3. Siffror (ints, longs, doubles, decimals)
  4. Symbol, sträng
  5. Objekt
  6. Array
  7. BinData
  8. ObjectId
  9. Boolesk
  10. Datum
  11. Tidsstämpel
  12. Reguljärt uttryck
  13. MaxKey (intern typ)

Anta att vi har en samling som kallas inlägg med följande dokument:

{
	"_id" : 1,
	"title" : "Web",
	"body" : "Create a funny website with these three easy steps...",
	"date" : "2021-01-01T00:00:00.000Z"
}
{
	"_id" : 2,
	"title" : "Animals",
	"body" : "Animals are funny things...",
	"date" : ISODate("2020-01-01T00:00:00Z")
}
{
	"_id" : 3,
	"title" : "Oceans",
	"body" : "Oceans are wide and vast, but definitely not funny...",
	"date" : ISODate("2021-01-01T00:00:00Z")
}

Observera att det första date fältet innehåller en datumsträng, medan de andra två dokumenten använder ett Date-objekt.

Observera också att datumsträngen innehåller exakt samma datum som dokument 3, och detta datum är ett senare datum än datumet i dokument 2.

Låt oss sortera efter date fält i dessa dokument:

db.posts.find().sort({ date: 1 }).pretty()

Resultat:

{
	"_id" : 1,
	"title" : "Web",
	"body" : "Create a funny website with these three easy steps...",
	"date" : "2021-01-01T00:00:00.000Z"
}
{
	"_id" : 2,
	"title" : "Animals",
	"body" : "Animals are funny things...",
	"date" : ISODate("2020-01-01T00:00:00Z")
}
{
	"_id" : 3,
	"title" : "Oceans",
	"body" : "Oceans are wide and vast, but definitely not funny...",
	"date" : ISODate("2021-01-01T00:00:00Z")
}

I det här fallet sorterade vi i stigande ordning, vilket betyder att tidigare datum bör komma först. Men vårt första dokument innehåller en datumsträng istället för ett Date-objekt, så det kom först – även om dess datum är senare än datumet i dokument 2.

Här är den igen, men i fallande ordning:

db.posts.find().sort({ date: -1 }).pretty()

Resultat:

{
	"_id" : 3,
	"title" : "Oceans",
	"body" : "Oceans are wide and vast, but definitely not funny...",
	"date" : ISODate("2021-01-01T00:00:00Z")
}
{
	"_id" : 2,
	"title" : "Animals",
	"body" : "Animals are funny things...",
	"date" : ISODate("2020-01-01T00:00:00Z")
}
{
	"_id" : 1,
	"title" : "Web",
	"body" : "Create a funny website with these three easy steps...",
	"date" : "2021-01-01T00:00:00.000Z"
}

Återigen beställs de olika datatyperna separat inom sig själva.

Sortera textresultatmetadata

Du kan använda { $meta: "textScore" } argument för att sortera efter fallande relevanspoäng när du använder $text sökningar.

Exempel

db.posts.find(
   { $text: { $search: "funny" } },
   { score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()

Resultat:

{
	"_id" : 2,
	"title" : "Animals",
	"body" : "Animals are funny things...",
	"date" : ISODate("2020-01-01T00:00:00Z"),
	"score" : 0.6666666666666666
}
{
	"_id" : 3,
	"title" : "Oceans",
	"body" : "Oceans are wide and vast, but definitely not funny...",
	"date" : ISODate("2021-01-01T00:00:00Z"),
	"score" : 0.6
}
{
	"_id" : 1,
	"title" : "Web",
	"body" : "Create a funny website with these three easy steps...",
	"date" : "2021-01-01T00:00:00.000Z",
	"score" : 0.5833333333333334
}

I det här exemplet sorterade vi efter { $meta: "textScore" } .

Från MongoDB 4.4 raden som går { score: { $meta: "textScore" }} är valfritt. Om du utelämnar detta utelämnas score fältet från resultaten. Därför kan vi göra följande (från MongoDB 4.4):

db.posts.find(
   { $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()

Resultat:

{
	"_id" : 2,
	"title" : "Animals",
	"body" : "Animals are funny things...",
	"date" : ISODate("2020-01-01T00:00:00Z")
}
{
	"_id" : 3,
	"title" : "Oceans",
	"body" : "Oceans are wide and vast, but definitely not funny...",
	"date" : ISODate("2021-01-01T00:00:00Z")
}
{
	"_id" : 1,
	"title" : "Web",
	"body" : "Create a funny website with these three easy steps...",
	"date" : "2021-01-01T00:00:00.000Z"
}

Gör $text sökningar som denna kräver att vi har skapat ett textindex. Om inte, en IndexNotFound fel kommer att returneras.

Mer information

Se MongoDB-dokumentationen för mer information.


  1. Mongoose, CastError:Cast to Array misslyckades för värde när man försökte spara en modell som innehåller en modell

  2. Kolv:skicka runt bakgrundsarbetarjobb (rq, redis)

  3. Använd 'MongoMappingContext#setAutoIndexCreation(boolean)' eller åsidosätt 'MongoConfigurationSupport#autoIndexCreation()' för att vara explicit

  4. Stoppa redis-servern. Varken avstängning eller stopp fungerar