#javascript #node.js #mongodb
#язык JavaScript #node.js #mongodb
Вопрос:
Привет, у меня есть схема монго под названием «платежи», в которой есть 2 ключа, которые являются необязательными: идентификатор пользователя или идентификатор представителя (если идентификатор пользователя существует, идентификатор представителя не существует и то же самое о идентификаторе представителя). Когда я нашел схему платежей, основанную на схеме чеков , которая использует $match для фильтрации результата на основе моих данных, я приношу все платежи в первом поиске, которые соответствуют моему запросу, во втором и третьем поиске я хочу привести данные пользователя / репрезентативные данные. Может быть, это будет смесь из них, все в порядке, это то, что я хочу видеть, если одного из них не существует, другой должен существовать.
Я хочу получить окончательный массив, который включает пользователя или представителя или их сочетание в одном массиве.
Я использую aggregate для реализации этого.
проблема в том, что он возвращает мне пустой массив, когда отображаются 2 поиска(пользователь и представитель), но когда я комментирую поиск пользователя или представителя, и я оставил 2 поиска для оплаты, и после этого последнего поиска пользователь / представитель и его работа мне нравится, как я хочу, но только для пользователя / представителя, только если я удалю один из поиска. Я хочу, чтобы он привел мой массив с двумя из них.
const userAndRepData = await ChequeDB.aggregatelt;{[key: string]: any}gt;([ { $match: { $and: [ { 'chequeNumber': { $in: chequeData.map(c =gt; c.chequeNumber) }, 'accountNumber': { $in: chequeData.map(c =gt; c.accountNumber) } } ] } }, { $lookup: { from: 'payments', localField: 'paymentId', foreignField: '_id', as: 'payment' } }, { $unwind:'$payment' }, { $lookup: { from: 'representatives', localField: 'payment.representativeId', foreignField: '_id', as: 'representative' } }, { $unwind: '$representative' }, { $lookup: { from: 'users', localField: 'payment.userId', foreignField: '_id', as: 'user' } }, { $unwind: '$user' }, { $project: { user: 1, _id: 0, representative: 1 } } ]);
Ответ №1:
К сожалению, вы не можете использовать данные из одного $lookup
в следующем, так как данные из $lookup
все еще не были загружены в момент выполнения запроса, т. е. payment.representativeId
будут равны нулю.
Вы можете писать ресурсоемкие запросы, которые будут обходить это, но самый простой и лучший (с точки зрения производительности) способ выполнения этого запроса — иметь representativeId
и userId
хранить в Cheque
коллекции.
Комментарии:
1. Как я могу это сделать?
2. Если возможно, вам нужно будет сохранить
representativeId
иuserId
в вашейCheque
коллекции, чтобы вы могли использовать ее в поиске. Не уверен, как выглядит ваш код, но вам также потребуется обновить методы вставки/обновления чеков, чтобы сохранить эти поля.