sql >> Databáze >  >> NoSQL >> MongoDB

Pořadí výsledků v MongoDB s $in?

Obecně:pokud vyhledáváte bez zadaného pořadí řazení, není zaručeno řazení výsledků.

Navíc není možné třídit podle pole (o to méně, pokud chcete třídit pole podle pole, jak je popsáno). A sort() používá logické porovnání k určení vzestupného nebo sestupného pořadí na základě pole ve vašich výsledných dokumentech.

Museli byste implementovat jakoukoli požadovanou vlastní logiku třídění ve svém vlastním kódu aplikace.

Užitečným přístupem může být využití nového rámce agregace v MongoDB 2.2 .. zejména schopnost $unwind pole do proudu dokumentů.

Například nastavení testovacích dat jako:

{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac946b50571321b2f932b"), "a" : [ 5, 4, 9 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }

$in hledání na [2,3] by vedlo k odpovídajícím dokumentům:

> db.matches.find({'a': { $in: [2,3]}})
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }

S agregačním rámcem můžete $match stejné dokumenty a poté manipulujte s výsledky, abyste dosáhli základního třídění:$unwind pole, $sort a poté $group tyto zpět do výsledku:

db.matches.aggregate(
  { $match : {
       a: { $in: [2,3] }
  }},
  { $unwind : "$a" },
  { $sort: {
      "a": -1
  }},
  { $group : {
      _id: '$_id',
      a: { $addToSet: "$a" }
  }}
)

V tomto příkladu jsou tedy dokumenty s odpovídajícími poli nyní seřazeny ve vzestupném pořadí podle hodnot pole:

{
    "result" : [
        {
            "_id" : ObjectId("504ac94eb50571321b2f932c"),
            "a" : [ 1, 2, 3]
        },
        {
            "_id" : ObjectId("504ac93fb50571321b2f932a"),
            "a" : [ 1, 2, 4 ]
        },
        {
            "_id" : ObjectId("504ac954b50571321b2f932d"),
            "a" : [ 3, 7, 9 ]
        }
    ],
    "ok" : 1
}


  1. Chyba Docker container mongod při spouštění přes ssh

  2. Rails 3 používající MongoDB přes mongoidní adaptér – existuje nějaký způsob, jak sdílet specifikace atributů bez použití dědičnosti jedné tabulky?

  3. Ukládejte související klíče jako OID nebo řetězce v MongoDB

  4. MongoDB - Vytvořte vztah