Подтвердить что ты не робот

Встроенный документ без массива?

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

4b9b3361

Ответ 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 }},