Сортировать базу коллекций по записи внедренного объекта - PullRequest
2 голосов
/ 14 мая 2011

Приведенный список пользователей с каждым пользователем имеет свои встроенные проекты (с отметкой времени). Как получить список пользователей вместе с их последними проектами?

например:

{"_id" : ObjectId("4dcc2a5b3db44135cf000004"),
 "name" : "User1",
 "projects" : [
   {"created_at" : ISODate("2011-05-13T08:16:22Z"),
    "_id" : ObjectId("4dcce8d63db4410f04000001"),
    "name" : "User1 Project 1"
   },
   {"created_at" : ISODate("2011-05-13T08:16:22Z"),
    "_id" : ObjectId("4dcce8d63db4410f04000002"),
    "name" : "User1 Project 2"
   }
 ]
}
{"_id" : ObjectId("4dcc2fed3db44135cf000007"),
 "name" : "User2",
 "projects" : [
   {"created_at" : ISODate("2011-05-13T09:36:33Z"),
    "_id" : ObjectId("4dccfba13db4410f68000001"),
    "name" : User2 Project 2"
   }
 ]
}

Я хочу отобразить эти данные в виде таблицы: | имя пользователя | название последнего проекта |

Я понял, что используя mongoid, я могу сделать что-то вроде

users = User.all
users.each do | user |
   p user.name
   p user.latest_project_name
end

with latest_project_name as :
   def latest_project_name
      self.projects.desc(:created_at).try(:name) || ''
   end

вопрос: 1. Будет ли это ввести n + 1 проблемы, как в SQL? 2. как, если я хочу отсортировать таблицу по последнему названию проекта? Могу ли я сделать это внутри mongodb? или мне нужно сделать Array.sort?

примечание: я довольно новичок в mongodb, так что это может быть проблемой дизайна. Все еще выясняю, как думать в mongodb.

Ответы [ 2 ]

3 голосов
/ 14 мая 2011

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

См .:https://jira.mongodb.org/browse/SERVER-142

В качестве небольшого отступления вы можете использовать поле _id для сортировки, поскольку ObjectID содержит метку времени (которая фактически устраняет необходимость в вашем поле selected_at, хотя его наличие не повредит).См .: http://www.mongodb.org/display/DOCS/Object+IDs, если вы хотите узнать больше о формате ObjectID.

1 голос
/ 14 мая 2011

Если 'projects' всегда сортируется по 'create_at', то вы можете использовать оператор $ slice для получения последних N записей массивов 'projects'В противном случае вам необходимо отсортировать на стороне клиента массив проектов и срез на уровне приложения.

...