Мангуст заселить денормализованные данные - PullRequest
0 голосов
/ 05 июля 2018

У меня есть модель User и модель Book. Я хочу, чтобы некоторые данные из моих книг были денормализованы для каждого User документа, но при этом у меня есть возможность заполнять их при необходимости. Если я установлю ref: 'Book' на books.$._id, он будет заполнен внутри пути _id, который является непреднамеренным. Я бы хотел, чтобы население переписало денормализованные данные.

Как мне это сделать?

in users.model.js :

const { Schema } = require('mongoose');

const UserSchema = new Schema({
    name: String,
    books: {
        type: [
            {
                _id: Schema.Types.ObjectId,
                title: String,
                length: Number,
            },
        ],
        default: [],
    },
});

Желаемый результат

in users.controller.js :

app.get('/', async (req, res, next) => {
    const users = await User.find({})
    /*
    users: [{
        _id: ObjectId(),
        name: 'Andrew',
        books: [{
            _id: ObjectId(),
            title: 'Game of Thrones',
            length: 298,
        }, { ... }],
    }, { ... }]
    */
});

app.get('/:id', async (req, res, next) => {
    const book_id = req.params.id;
    const user = await User.findById(book_id).populate({
        path: 'books',
        model: 'Book',
    });
    /*
    user: {
        _id: ObjectId(),
        name: 'Andrew',
        books: [{
            _id: ObjectId(),
            name: 'Game of Thrones',
            length: 298,
            author: 'Simone Dunow',
            releasedOn: Date(),
            price: 30,
            ...
        }, { ... }],
    }
    */
});

Схемы, которые я пробовал до сих пор:

    books: {
        type: [
            {
                _id: Schema.Types.ObjectId,
                title: String,
                length: Number,
            },
        ],
        default: [],
        ref: 'Book',
    },

возвращает массив { _id: null }

    books: {
        type: [
            {
                _id: {
                    type: Schema.Types.ObjectId,
                    ref: 'Book',
                },
                title: String,
                length: Number,
            },
        ],
        default: [],
    },

книги находятся внутри _id: { _id: { Book } }

    books: {
        type: [
            {
                type: {
                    _id: Schema.Types.ObjectId,
                    title: String,
                    length: Number,
                },
                ref: 'Book',
            },
        ],
        default: [],
    },

выдает исключение: недопустимый тип

1 Ответ

0 голосов
/ 05 июля 2018
const UserSchema = new Schema({
    name: String,
    books: [{
        id: { type : Schema.Types.ObjectId, ref : 'Book'} //Whatever string you have used while modeling your schema
        title: String,
        length: Number,
    }],
});

При использовании схемы вы можете заполнить ее следующим образом:

populate({ path: 'books.id' })

Выход:

{ 
    _id : // someid
    name : "somename"
    books : [
        { 
          id : {//document referring to Books collection},
          title : "sometitle",
          length : //somelength
        }, ...
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...