MongoDB (Mongoose) присоединяет запрос с нумерацией страниц

#mongodb #mongoose

Вопрос:

У меня есть две модели MongoDB

 var CompanySchema = new Schema({
    company_name: {
        type: String,
        required: true
    })
    application.accountDB.model('companies', CompanySchema)

var UserSchema = new Schema({
        customer_email: {
        type: String,
        required: false
       },
        company_id: {
        type: String,
        required: false,
        ref: 'companies'
       }
    application.accountDB.model('users', UserSchema)
 

Я пытаюсь разбить на страницы компании, а также получать электронную почту из таблицы users, но приведенный ниже запрос приводит к разбиению на страницы пользователей и заполнению компаний, я хочу наоборот.

  users.find({},{limit:10, page:0 },{populate : [{path:"company",model : application.accountDB.model('companies')}]})
 

Ответ №1:

Из вашего объяснения следует, что это Companies основная коллекция, на которой вы хотите сосредоточиться, с возможностью просмотра информации о Users том, кто связан с этой компанией?

Исходя из этого варианта использования, лучшим подходом здесь было бы работать со Companies схемой, а затем присоединиться к Users коллекции после разбивки на Companies страницы .

Кроме того, агрегация MongoDB идеально подходит для этого типа запросов, которые я бы рекомендовал использовать. В приведенном мною примере используется агрегация Mongo для получения разбитого на страницы списка Companies с их привязкой Users .

 const paginatedCompanies = await Companies.aggregate([
    { $match: { ... } },   // Use this to filter the companies if required
    { $sort: { "<field>": 1 } },   // Replace <field> with the name of whatever field you want to sort on
    { $skip: <skip> },   // Replace <skip> with the number of records you want to skip over 
    { $limit: <limit> },   // Replace <limit> with the page size you want
    { $lookup: {
        from: "Users",
        localField: "_id",
        foreignField: "company_id",
        as: "users"
    } }
]);
 

Который должен выводить что-то вроде этого:

 [
    {
        _id: "companyId",
        company_name: "Company Name",
        users: [
            {
                _id: "userId",
                customer_email: "email",
                company_id: "companyId"
            },
            ...
        ]
    },
    ...
]