MongoDB ifNull при поиске - PullRequest
       13

MongoDB ifNull при поиске

0 голосов
/ 12 января 2020

Я пытаюсь выяснить, как сделать следующее:

В настоящее время я использую следующий скрипт, чтобы увидеть, соответствует ли объявление списку.

'$lookup': {
                'from': 'advertisers', 
                'localField': 'title', 
                'foreignField': 'title', 
                'as': 'adsys'
            }

, но некоторые из наших списков У него нет рекламы, и когда он в настоящее время возвращается, он показывает adsys: []

Вместо этого я хотел бы, чтобы он показывал рекламу на adsys: NULL или полностью удалил adsys. Я посмотрел на

$ifNull

Однако я не уверен, как прикрепить его к adsys, если он находится в поиске.

Я попробовал это:

 {
            '$lookup': {
                'from': 'advertisers', 
                'localField': 'title', 
                'foreignField': 'title', 
                'as': 'adsys'
            }
        },
        {
                '$project': {
                   'title': 1,
                   'adsys': { '$ifNull': [ "$adsys", "Unspecified" ] }
                }
             }

и это вернуло это:

{"data":[{"track":[{"_id":"5e1a96c3081a7a70d5c8971f","title":"Out of Mind","adsys":[]}]}]}

что я хотел бы сделать, это вернуть это

 {"data":[{"track":[{"_id":"5e1a96c3081a7a70d5c8971f","title":"Out of Mind","adsys":NULL}]}]}

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Вы можете попытаться добавить это в качестве конечной стадии:

{$project : {'title' :1, 'adsys' : {$cond : [{$gt:[{$size: '$adsys'}, 0]}, '$adsys' , null ] }}}

Таким образом, ваш запрос будет:

{
    '$lookup': {
        'from': 'advertisers',
        'localField': 'title',
        'foreignField': 'title',
        'as': 'adsys'
    }
}, { $project: { 'title': 1, 'adsys': { $cond: [{ $gt: [{ $size: '$adsys' }, 0] }, '$adsys', null] } } }

** Пример данных: **

/* 1 */
{
    "_id" : ObjectId("5e1aa8d5627ef782369ef777"),
    "title" : "Out of Mind",
    "adsys" : []
}

/* 2 */
{
    "_id" : ObjectId("5e1aa8e1627ef782369ef854"),
    "title" : "Out of Mind",
    "adsys" : [ 
        {
            "abc" : 1
        }
    ]
}

Результат:

/* 1 */
{
    "_id" : ObjectId("5e1aa8d5627ef782369ef777"),
    "title" : "Out of Mind",
    "adsys" : null
}

/* 2 */
{
    "_id" : ObjectId("5e1aa8e1627ef782369ef854"),
    "title" : "Out of Mind",
    "adsys" : [ 
        {
            "abc" : 1
        }
    ]
}
0 голосов
/ 12 января 2020

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

db.tableName.aggregate(
    [
        {
            '$lookup': {
                'from': 'advertisers',
                'localField': 'title',
                'foreignField': 'title',
                'as': 'adsys'
            }
        },
        { "$unwind": { path: "$adsys", preserveNullAndEmptyArrays: true } },
        {
            '$project': {
                'title': 1,
                'adsys': { '$ifNull': ["$adsys", "NULL"] }
            }
        }
    ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...