Как использовать другую модель в определении модели в Mongoose

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #mongoose

Вопрос:

Я пишу mongoose в Node.js , ES6.

Сначала я указал модель с именем Address , и хотел бы использовать Address модель в определении другой модели, Channel .

Коды выглядят следующим образом:

// Определение Address

 import mongoose from 'mongoose';
export const Address = mongoose.model('Address',
    {   
        id: mongoose.SchemaTypes.ObjectId,
        customer_id: String,
        addresses: [{
            address_type: String,
            address_info: String,
        }]
    });
 

Для другой модели Channel я хотел бы иметь subscriber поле, представляющее собой список Address .

Мой предварительный код выглядит следующим образом:

 import mongoose from 'mongoose';
import {Address} from './Address.js';
export const Channel = mongoose.model('Channel',
    {   
        id: mongoose.SchemaTypes.ObjectId,
        name: String,
        path: String,
        subscribers: [Address],
    });
 

Однако я получил ошибку, подобную этой:

 TypeError: Invalid schema configuration: `model` is not a valid type within the array `subscribers`
 

Интересно, как мне реализовать эту идею в NodeJS?

Комментарии:

1. вам нужен адрес или массив адресов, специфичных для каждого канала?

2. @Ako Массив адресов. Спасибо!!

Ответ №1:

Если я правильно понял, вы хотите, чтобы для каждого канала был указан массив адресов. таким образом, вы должны указать поле адреса в своем канале таким образом:

 import mongoose from 'mongoose';
//import {Address} from './Address.js';
export const Channel = mongoose.model('Channel',
    {   
        id: mongoose.Schema.Types.ObjectId,
        name: String,
        path: String,
        subscribers: [{
                       type: mongoose.Schema.Types.ObjectId,
                       ref: 'Address'
                      }],
    });
 

вам не нужно импортировать модель адреса в вашу модель канала, MongoDB распознает ее автоматически. затем, когда вы захотите создать документ канала, создайте его следующим образом:

 import {Address} from './Address';
import {Channel} from './Channel';

async function createChannel(){
  Channel.create({
                  name: 'theName',
                  path: 'thePath',
                  subscribers: [await Address.find()] //you can add all addresses by just use find or use your specific query to find your favored addresses.
})
}
 

Комментарии:

1. если вы используете экспорт по умолчанию, то вам не нужно это {} вокруг импортируемого объекта.

2. Большое спасибо! Должно ли это быть ref: 'Address' , поскольку в определении модели Address я использую заглавную букву? Спасибо

3. да, это должно быть ref: 'Address' с большой буквы, моя вина, извините. Я редактирую свой ответ. если это ответит на ваш вопрос, я буду рад, если вы примете его в качестве ответа.