Алфавитная сортировка Mongo db в coffeescript

#javascript #mongodb #sorting #coffeescript #alphabetical

#javascript #mongodb #сортировка #coffeescript #алфавитная

Вопрос:

У меня есть коллекция пользователей, и я вставляю их в поле выбора, чтобы пользователь мог их просматривать. Я хочу отсортировать эту коллекцию по имени пользователя, а затем передать ее дальше.

В настоящее время я беру имя комнаты, а затем возвращаю это имя комнаты.active_users. Он заполняет поле выбора, но затем не сортирует их.

 Template.room_active_users.getActiveUsers = (roomName) ->
    users = Rooms.findOne({room_name: roomName}).active_users
  

Я пытался делать

 users = Rooms.findOne({room_name: roomName}).active_users.profile.name
  

но это не работает.

В настоящее время это то, что находится внутри коллекции, когда я console.log(пользователи):

 [Object, null, Object]          // This says that there are 2 users in the room
   0: Object
       _id: "ryYnj48Gcgd25fwHm"
       profile:
           avatar_url:
           bio:
           blog:
           .
           .
           .
           login:
           name: Jerry
   1: null
   2: Object
       _id: "hg4mxeTjDxFdTpJJe"
       profile:
           avatar_url:
           bio:
           blog:
           .
           .
           .
           login:
           name: Bob
  

Я пытаюсь найти способ получить доступ к именам пользователей и просто отсортировать их таким образом, но вы не можете вызвать

 .active_users.profile.name
  

Это выдает эту ошибку:

 Exception from Deps recompute function: TypeError: Cannot read property 'name' of undefined
  

Я подумал, что для этого мне придется написать какую-то функцию сортировки, но все примеры, которые я искал, оказались неработающими, и ни один из них не является достаточно конкретным, чтобы соответствовать моему случаю.

Любая помощь очень ценится, спасибо.

Комментарии:

1. вместо этого попробуйте платформу агрегации

Ответ №1:

Вы можете сортировать и собирать данные в базе данных или делать это в коде. На самом деле БД будет лучше справляться с подобными вещами, и нет особой причины удалять все эти поля, когда вам нужно только одно. Но если вы хотите сделать это в коде, я бы использовал pluck от Lodash:

 # load the users collection into lodash so you can do multiple operations chained
# compact removes nulls
# pluck gets only a certain key from the collection of objects 
# value returns the value from the chain
#
_(Rooms.findOne({room_name: roomName})).compact().pluck('name').value() 
  

Действительно ли findOne не является асинхронным? Похоже, так и должно быть…

Также похоже, что findOne принимает параметр проекции, и в этом случае вам нужно будет просто передать его следующим образом:

 Rooms.findOne({room_name: roomName}, {'name':1})