Mongodb Как сопоставить одно из двух полей, не равных нулю? - PullRequest
1 голос
/ 17 июня 2020

Мне нужно сопоставить одно из двух полей, которое не должно быть равно нулю. Как это реализовать?

Я пробую эти решения, но мне не повезло:

Решение 1:

Model.aggregate[
{
            $project: {
                accountID: "$_id.accountID",
                locationID: "$_id.locationID",
                time: "$_id.time",
                value: "$value",
                actualValue: "$actualValue",
                total: { $add: ["$value", "$actualValue"] },
            },
        },
        {
            $match: {
                total: { $ne: 0 },
            },
        },
]

С этим решением будет неправильно при отрицательном плюсе с противоположной версией. Пример -1500 + 1500 станет нулем.

Решение 2

Model.aggregate([
        {
            $group: {
                _id: {
                    accountID: "$accountID",
                    locationID: "$locationID",
                    time: "$time",
                },
                value: { $sum: "$values.val" },
                actualValue: { $sum: "$values.actualVal" },
            },
        },
        {
            $addFields: {
                absVal: { $abs: "$value" },
                absActualVal: { $abs: "$actualValue" },
            },
        },
        {
            $project: {
                accountID: "$_id.accountID",
                locationID: "$_id.locationID",
                time: "$_id.time",
                value: "$value",
                actualValue: "$actualValue",
                total: { $add: ["$absVal", "$absActualVal"] },
            },
        },
        {
            $match: {
                total: { $ne: 0 },
            },
        },
])

Это работает, но я потерял 1 секунду с 3,5 до 4,5 при поиске на 1 м документ.

Есть предложения? Сначала спасибо

1 Ответ

1 голос
/ 17 июня 2020

Некоторых базовых c логических логических c должно хватить, используйте что-то вроде:

Model.aggregate([
    {
        $match: {
            $or: [
                {
                    value: {$ne: 0}
                },
                {
                    actualValue: {$ne: 0}
                }
            ]
        }
    }
    {
        $project: {
            accountID: "$_id.accountID",
            locationID: "$_id.locationID",
            time: "$_id.time",
            value: "$value",
            actualValue: "$actualValue",
            total: {$add: ["$value", "$actualValue"]},
        },
    }
])

Если вы заботитесь об эффективности, убедитесь, что у вас есть составной индекс, который охватывает как value, так и actualValue.

...