Одним из решений этого является хранение комментариев в виде отдельной модели, к которой вы можете напрямую обращаться, и сохранение ссылок на связанные идентификаторы объектов и пути между комментариями и сообщениями.
Использование функции Populate в документах, связанных с Mongoose, может функционировать аналогично встроенным документам, хотя есть некоторые важные отличия. в том, как вы их запрашиваете, и вы должны быть более осторожны, чтобы поддерживать заполненные отношения.
Настройте это так:
var mongoose = require('mongoose')
, Schema = mongoose.Schema
, ObjectId = Schema.Types.ObjectId;
var PostsSchema = new Schema({
body : String,
stories : [{ type: ObjectId, ref: 'Story' }]
});
var CommentsSchema = new Schema({
body : String,
post : { type: ObjectId, ref: 'Post' },
comments : [{ type: ObjectId, ref: 'Comment' }]
});
var Story = mongoose.model('Post', PostsSchema);
var Comment = mongoose.model('Comment', CommentsSchema);
Если вы сделаете это таким образом, потребуется больше запросов, чтобы получить сообщение со всеми его комментариями (что будет медленнее, чем возможность загрузить сообщение и его полную иерархию комментариев с помощью одного запроса), однако вы сможете запрашивать комментарии напрямую. и получить публикацию, в которой они были сделаны (но нелегко найти полный путь к комментарию, когда он вложен).
Все это компромиссы; лучшее решение (рекурсивно искать комментарии или сохранять их независимо, а затем рекурсивно загружать) должно быть принято в контексте вашего приложения и ожидаемых шаблонов его использования.
Еще одно предостережение; функция заполнения в настоящее время ограничена одним уровнем связанных ObjectId; вы должны вызывать его для каждого возвращаемого комментария, чтобы получить полный вложенный набор данных. Есть несколько подключаемых модулей, которые помогают в этом, например, mongoose-subpopulate. поддерживаться изначально в Mongoose — см. ошибку github здесь.
person
Jed Watson
schedule
16.10.2012