#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})