#mongodb #aggregation-framework
#mongodb #платформа агрегации
Вопрос:
Я знаю, что в таблице журналов "mailID"
есть "1234"
(строка)
а в почтовой таблице "_id"
равно 1234 (NumberInt)
Но есть ли вообще какой-либо способ сделать это $lookup
?
таблица журнала
{
"_id" : "mailStuff0234",
"mailID" : "1234",
"typeState" : "NEW",
"changeByType" : "ADMIN"
}
таблица почты
{
"_id" : NumberInt(1234),
"user" : "torben@sunnythailand.com",
"subject" : "Visit to Atlantis Condo Resort"
}
и вот совокупность
db.log.aggregate([
{ '$match': { typeState: 'NEW'} },
{ '$lookup': {
from: 'mail',
localField: 'mailID',
foreignField: '_id',
as: 'mail'
} },
{ '$unwind': '$mail' }
], {})
Комментарии:
1. Вы можете сделать это, используя более низкую версию mongodb минимум mongodb 3.6
Ответ №1:
В MongoDB 4.0 введен оператор $ toInt, чтобы вы могли преобразовать mailID
значение перед применением поиска.
db.log.aggregate([
{
$addFields: { mailID: { $toInt: "$mailID" } }
},
{
$lookup: {
from: "mail",
localField: "mailID",
foreignField: "_id",
as: "mail"
}
}
])
Вы также можете использовать поиск $ с пользовательским конвейером:
db.log.aggregate([
{
$lookup: {
from: "mail",
let: { mailID: { $toInt: "$mailID" } },
pipeline: [ { $match: { $expr: { $eq: [ "$_id", "$$mailID" ] } } } ],
as: "mail"
}
}
])
Комментарии:
1. Большое тебе спасибо, Микл!!! Отличные решения для обоих. Не знал $ toInt, так что это ОЧЕНЬ полезно!!!
2. Ошибка: ОШИБКА findLogMail: MongoError: Нераспознанное выражение ‘$ toInt’ — думаю, мне нужно обновить: D
3. Да, вам нужен 4.0 или новее