Встроенный документ без массива?
Я понимаю, как вставлять документы в Mongoose, и они кажутся довольно простыми, если они хранятся в виде массивов, для которых пример использования довольно очевиден:
var CommentSchema = new Mongoose.Schema({...});
var BlogPostSchema = new Mongoose.Schema({
comments : [CommentSchema],
});
Но то, что я не вижу, как это сделать после просмотра документации вперед и назад, заключается в том, как хранить отдельный поддокумент, который не нужен или хочет находиться в массиве.
var UserSchema = new Mongoose.Schema({...});
var BlogPostSchema = new Mongoose.Schema({
author: ??? // 'UserSchema' and UserSchema do not work here.
});
Есть ли способ сделать эту работу? Я не хочу просто хранить ObjectId, а скорее хранить полную копию пользовательской записи, но не нужен или не нужен массив.
Ответы
Ответ 1
Вы не можете встраивать схемы таким образом, исходя из того, что эти дочерние документы будут путаться с полными документами, см. этот поток ошибок, где говорится:
причина, по которой мы не добавляли эту поддержку в прошлом, - это b/c, поэтому нам интересно, будут ли все предварительные крючки выполняться одинаково для псевдо-дочернего документа, а также означает, что мы можем вызвать save() для этого ребенка.
Ответ здесь заключается в том, чтобы поделиться не схемой, а просто определением.
var userdef = { name: String };
var UserSchema = new Schema(userdef);
var BlogPostSchema = new Schema({author: userdef});
Это приведет к вложенному объекту пользователя без фактического вложения схемы.
Ответ 2
Простое разделение информации не поддерживает буферизацию валидации. И вам может понадобиться также проверка UserSchema.
Вместо этого я рекомендую проверку длины массива
author: {type:[UserSchema], validate: function (arr) { return arr.length == 1 }},
Ответ 3
UPDATE:
В случае, если кто-то столкнется с этим сейчас, а с Mongoose 4.2.0 существуют одиночные встроенные поддокументы!:)
http://mongoosejs.com/docs/subdocs.html#single-embedded