#mongodb #mongoose #aggregation-framework
#mongodb #мангуст #структура агрегации
Вопрос:
У меня есть две коллекции user
и transaction
, транзакция имеет два поля customer
и seller
, а пользователь имеет два поля name
и email
., коллекция пользователей содержит данные клиентов и продавцов
Я хочу выводить так, как если email
бы переданное принадлежало customer
, тогда seller
детали должны поступать из поиска, а если email
переданное принадлежит seller
, то customer
детали должны поступать из поиска
Что я сделал, так это то, что я передаю значение email
динамически, email
значение может принадлежать customer
или seller
, если email
совпадает seller
, тогда я хочу localfield
, чтобы поиск в качестве customer
и наоборот. Вот что я пробовал.
const email = req.email;
transaction.aggregate([{
$match: {
$or: [{
customer: email,
},
{
seller: email,
},
],
},
},
{
$lookup: {
from: "user",
localField: {
$cond: [{
if: {
$eq: ["$customer", email]
},
then: "seller",
else: "customer",
}],
},
foreignField: "email",
as: "user",
},
},
{
$unwind: "$user"
},
]);
Но для приведенного выше запроса ошибка выглядит следующим образом
$lookup argument 'localField' must be a string
Я использую nodejs, express и mongoose.
Ответ №1:
localField
Разрешает только строку, вы можете использовать поиск с конвейером,
let
чтобы определить логику ваших условийpipeline
чтобы поместить ваше условие соответствия в поле коллекции поиска
{
$lookup: {
from: "user",
let: {
localField: {
$cond: [{
if: { $eq: ["$customer", email] },
then: "$seller",
else: "$customer",
}]
}
},
pipeline: [
{ $match: { $expr: { $eq: ["$email", "$$localField"] } } }
],
as: "user"
}
}
Комментарии:
1.
$cond
значением в этом случае должен быть просто объект из массива2. @SemyonVyskubov не совсем понял вас.