MongoDB выполняет поиск $ в полях разных типов, но с одинаковым содержимым

#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 или новее