MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Sortieren Sie ein Array und fügen Sie ein Rangfeld in MongoDB hinzu

Ich denke, Ihre Methode ist gut, aber ändern Sie einfach die results.length zu user.length aber wenn Sie den MongoDB-Betrieb verwenden möchten, gehen Sie folgendermaßen vor:

db.collection.aggregate([
  {
    "$sort": {
      "score": -1
    }
  },
  {
    "$group": {
      "_id": "",
      "items": {
        "$push": "$$ROOT"
      }
    }
  },
  {
    "$unwind": {
      "path": "$items",
      "includeArrayIndex": "items.rank"
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$items"
    }
  },
  {
    "$sort": {
      "score": -1
    }
  }
])

Sie können lean() verwenden und select die einige Felder in find Abfrage zur Leistungssteigerung

async findRank() {
  const users = await User.find({},"_id score").sort({score: -1}).lean()
  for (let index = 0; index < users.length; index++) {
    users[index].rank = index
  }
  return users
}
if you want group by the documents based on name or score ... it's better use mongodb operation