Поиск встроенных документов Mongoose + nodejs - PullRequest
0 голосов
/ 01 июня 2011

Я новичок в Mongoose, и у меня возникла проблема с поиском.

Это мои схемы:

var CommentSchema = new Schema({
    body       : String
  , comments   : [CommentSchema]
});

var PostSchema = new Schema({
    body        : String
  , comments    : [CommentSchema]
});

Есть глубокая вложенность комментариев. Когда кто-то отвечает на существующий комментарий, как я могу найти этот комментарий?

Ответы [ 2 ]

0 голосов
/ 16 октября 2012

Одним из решений этой проблемы является сохранение комментариев в виде отдельной модели, к которой можно обращаться напрямую, и хранение ссылок на связанные 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 .

0 голосов
/ 02 июня 2011

вы можете посмотреть примеры тестов на мангусте на github

model_querying_test

Вот что вы ищете:

результаты теста на основе встроенных полей документа:

function () {
    var db = start(), BlogPostB = db.model('BlogPostB', collection);

    BlogPostB.create({comments: [{title: 'i should be queryable'}]}, function (err, created) {
      should.strictEqual(err, null);
      BlogPostB.findOne({'comments.title': 'i should be queryable'}, function (err, found) {
        should.strictEqual(err, null);
        found._id.should.eql(created._id);
        db.close();
      });
    });
    },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...