Одним из решений этой проблемы является сохранение комментариев в виде отдельной модели, к которой можно обращаться напрямую, и хранение ссылок на связанные ObjectIds и пути между комментариями и сообщениями.
Использование функции Заполнить в документах, связанных с 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);
Если вы сделаете это таким образом, потребуется больше запросов, чтобы получить сообщение со всеми его комментариями (что будет медленнее, чем возможность загрузить публикацию и ее полную иерархию комментариев одним запросом), однако вы сможете напрямую запрашивать комментарии и извлекать сообщение, на которое они были сделаны (но не всегда легко найти полный путь к комментарию, когда он вложен).
Это все компромиссы; лучшее решение (либо рекурсивно искать комментарии, либо сохранять их независимо, а затем рекурсивно загружать их) должно приниматься в контексте вашего приложения и ожидаемых шаблонов его использования.
Еще одна оговорка; функция заполнения в настоящее время ограничена одним уровнем связанных ObjectIds; Вы должны вызывать его для каждого возвращаемого комментария, чтобы получить полный вложенный набор данных. В этом есть несколько плагинов, таких как mongoose-subpopulate , и достаточно скоро он будет изначально поддерживаться в Mongoose - см. Здесь проблему github .