Как заполнить документы из другой коллекции. Конкретный случай

Как получить данные из запроса, который включает 2 коллекции: клиенты и адреса

Мне нужно получить всех клиентов со всеми адресами для всех из них, запрашивая коллекцию клиентов.

Использование мангуста это 2 схемы:

адресаклиентов:

var Customer = require('./customer');

var Schema = mongoose.Schema;

var addressSchema = Schema({
    address: {
        type: String,
        required: false,
        unique: false
    },
    customer: {
        type: Schema.Types.ObjectId,
        ref: 'Customer'
    }
}, {
    timestamps: true
});

module.exports = mongoose.model('Addresscustomer', addressSchema, 'addressescustomers');

клиенты:

var Addresscustomer = require ('./addresscustomer');

var Schema = mongoose.Schema;

var customerSchema = Schema({
    name: {
        type: String,
        required: false,
        unique: false
    },
    address: {
        type: Array,
        ref: 'Addresscustomer'
    }
}, {
    timestamps: true
});

module.exports = mongoose.model('Customer', customerSchema, 'customers');

Мне нужно выполнить запрос к клиентам, что я делаю:

Customer.find({}, function (err, customers) {
            Addresscustomer.populate(customers, { path: "address" }, function (err, customers) {
                console.log('Customers: '+ customers);
            });
        });

Or:

var query = Customer.find({}).populate('address');
query.exec(function (err, customers) {
        console.log('Customers: '+ customers);
    });

Но ключ address в коллекции клиентов не заполнен. Подскажите, как правильно настроить схемы и запрос, чтобы получить правильные данные?


person Carlos    schedule 27.11.2017    source источник
comment
Возможный дубликат Как запрашивать ссылочные объекты в MongoDB?   -  person sidgate    schedule 27.11.2017
comment
@sidgate Это не дубликат, правильная ссылка находится в addresscustomers с: type: Schema.Types.ObjectId, ref: 'Customer' }, и мне нужно сделать запрос из коллекции клиентов, а не из addresscustomers, у одного клиента много адресов. Можно ли это сделать с помощью метода populate() от Mongoose?   -  person Carlos    schedule 27.11.2017


Ответы (1)


Вы можете использовать $lookup для заполнения ссылки на адрес. Поскольку в Mongo 3.4 $lookup работает и в поле массива.

db.customers.aggregate([
    { "$lookup": {
       "from": "addressescustomers",
       "localField": "address",
       "foreignField": "_id",
       "as": "addr"
    }}
])
person sidgate    schedule 27.11.2017
comment
Это решение, хотя для моего конкретного случая: я установил так: db.customers.aggregate([ { $lookup: { from: addresscustomers, localField: _id, ForeignField: customer, as: addr }} ]) - person Carlos; 28.11.2017