Запрос представлений с помощью Mongoose (и инкапсуляция полей документов)

avatar
pi88a
8 августа 2021 в 22:24
191
1
1

Я использую mongodb представления для инкапсуляции данных в объекте передачи данных.

После первого запуска приведенного ниже кода в базе данных создается представление. Последующее выполнение моего кода приведет к ошибке: MongoError: Namespace already exists. Я нахожу этот метод довольно неудобным.

В Google не так много информации о том, как использовать представления в mongoose. Итак, можете ли вы поделиться некоторыми из лучших практик инкапсуляции данных для клиента? Возможно, мне не следует использовать представления mongodb для этой цели. Что посоветуете?

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    first: String,
    last: String, 
});
const viewSchema = new mongoose.Schema({
    first: String,
    last: String, 
});

const User = mongoose.model('User', userSchema);

(async () => {
    mongoose.connect('mongodb://localhost:27017/tests');

    await User.create([{first: '1', last: '2'}, {first: '1', last: '2'}]);

    //creates 'UserView' view every run of the code :(
    await mongoose.connection.db.createCollection('UserView', {
        viewOn: 'users',
        pipeline: [
            { $project: { first : 0,} }
        ]
    });
    
    const View = await mongoose.model('View', viewSchema, 'UserView')
    console.log(await View.findOne());
    mongoose.disconnect();
})();
Источник

Ответы (1)

avatar
Mr. X
26 апреля 2022 в 04:50
0

У меня было такое же требование, и это решение, которое я придумал после небольшого исследования:

mongoose
    .connect(process.env.DB_CONNECTION)
    .then(() => {
        const mongooseConnection = mongoose.connection;
        const blocksAndMutesCollectionName = "blocks_and_mutes";
        mongooseConnection.db
            .listCollections({
                name: blocksAndMutesCollectionName
            })
            .next((error, result) => {
                // `result` null if collection not found
                if (!result) {
                    mongooseConnection.createCollection(blocksAndMutesCollectionName, {
                        viewOn: "users",
                        pipeline: require("./db/pipelines/blocks-and-mutes"),
                        collation: {
                            locale: "en",
                            strength: 2
                        }
                    });
                }
            });
        console.log("Connected to the database");
    })
    .catch(() => {
        console.log("Unable to connect to the database");
    });