Агрегат и $ ne не работают должным образом - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь выполнить агрегацию ниже, но, похоже, не получаю ожидаемого результата, используя $ ne и null .

Я пробовал другие решениякак использование комбинации $ cond , $ not и $ eq безрезультатно.Использование $ gt: ["$ unloadeddate", null] , кажется, дает некоторые результаты, но это не похоже на правильный синтаксис, и я обеспокоен, что не стоит работать правильно по всему набору данных.

Кроме того, запрос выполняется следующим образом:

db.getCollection('esInvoices').find({"esBlendTickets.loadeddate":{$ne:null}})

... возвращает результаты, поэтому не уверен, почему тот же запрос в статистической функции не работает.

Любая помощь приветствуется !!

Первая часть работает ...

"unloadeddate": { "$switch": {
        branches:[ {
            case: {
                "$ne":[ "$esBlendTickets.ticketdate", null]
            },
            then: "$esBlendTickets.ticketdate"
        }, {
            case: {
                "$ne":[ "$esDeliveryTickets.ticketdate", null]
            },
            then: "$esDeliveryTickets.ticketdate"
        }],
        default: null
    }
},
"loadeddate": { "$switch": {
        branches:[ {
            case: {
                "$ne":[ "$esBlendTickets.loadeddate", null]
            },
            then: "$esBlendTickets.loadeddate"
        }, {
            case: {
                "$ne":[ "$esDeliveryTickets.loadeddate", null]
            },
            then: "$esDeliveryTickets.loadeddate"
        }],
        default: null
    }
},

... но эта вторая часть (по сути та же логика, за исключением результирующего значения) не работаетработать как положено ...

"stagename": { "$switch": {
        branches:[ {
            case: {
                "$ne":[ "$esDeliveryTickets.ticketdate", null]
            },
            then: "Invoiced"
        }, {
            case: {
                "$ne":[ "$esBlendTickets.ticketdate", null]
            },
            then: "Invoiced"
        }],
        default: "Invoiced-Only"
    }
}

Полная агрегация:

db.esInvoices.aggregate([ {
    $addFields: {
        // A single invoice will not have both a blend ticket and delivery ticket associated so looping tough each case should work.
        "unloadeddate": { "$switch": {
                branches:[ {
                    case: {
                        "$ne":[ "$esBlendTickets.ticketdate", null]
                    },
                    then: "$esBlendTickets.ticketdate"
                }, {
                    case: {
                        "$ne":[ "$esDeliveryTickets.ticketdate", null]
                    },
                    then: "$esDeliveryTickets.ticketdate"
                }],
                default: null
            }
        },
        "loadeddate": { "$switch": {
                branches:[ {
                    case: {
                        "$ne":[ "$esBlendTickets.loadeddate", null]
                    },
                    then: "$esBlendTickets.loadeddate"
                }, {
                    case: {
                        "$ne":[ "$esDeliveryTickets.loadeddate", null]
                    },
                    then: "$esDeliveryTickets.loadeddate"
                }],
                default: null
            }
        },
        "stagedate": "$InvoiceHeader.InvDate",
        "stagename": { "$switch": {
                branches:[ {
                    case: {
                        "$ne":[ "$esDeliveryTickets.ticketdate", null]
                    },
                    then: "Invoiced"
                }, {
                    case: {
                        "$ne":[ "$esBlendTickets.ticketdate", null]
                    },
                    then: "Invoiced"
                }],
                default: "Invoiced-Only"
            }
        }
    }}])

1 Ответ

0 голосов
/ 31 июля 2018

Думаю, я столкнулся с той же проблемой, что и ты. Использование Mongo 3.4 на данный момент. Из того, что я могу сказать, запрос $ne ведет себя иначе, чем агрегат $ne, когда вы сравниваете его с null. Отшвырнул меня на немного.

В частности, предикат { $ne: [ '$field', null ] } в конвейере агрегат вернет true, если $field равно undefined.

Однако при использовании запросов (не $aggregate) предикат { field: { $ne: null } вернет false для тех же документов, когда $field равно undefined.

Мой обходной путь заключался в использовании $project с { field: { $ifNull: [ '$field': null ] } } на предыдущем шаге, чтобы превратить undefined экземпляров этого поля в явные null s, что затем заставит агрегат $ne работать как я необходимо. По любой причине $ ifNull работает с пустыми, неопределенными и отсутствующими полями. Не уверен, почему $ne отличается.


Вот пример для воспроизведения.

db.test.insertMany([
    { a: 1, b: 'string' },
    { a: 2, b: null },
    { a: 3 },
])

db.test.find({ b: { $ne: null }}, { _id: 0 })
/*
returns:
{
    "a" : 1.0,
    "b" : "string"
}
*/

db.test.aggregate([
    { $project: {
        _id: 0,
        a: 1,
        b: 1,
        switched: { $switch: {
            branches: [
                { case: { $ne: [ '$b', null ] }, then: 'cased' },
            ],
            default: 'default',  
        }}

    }}
])
/*
returns:
{
    "a" : 1.0,
    "b" : "string",
    "switched" : "cased"
},
{
    "a" : 2.0,
    "b" : null,
    "switched" : "default"
},
{
    "a" : 3.0,
    "switched" : "cased" <--
}
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...