Агрегация Mongo для складских данных

#javascript #node.js #mongodb #mongoose #aggregation-framework

#javascript #node.js #mongodb #mongoose #агрегация-фреймворк

Вопрос:

У меня есть схема ниже.

 {
    name: {
        type: String
    },
    available_in: [{
        variation: {
            type: Number
        },
        variation_type: {
            type: String,
            enum: ['gm', 'kg', 'ml', 'ltr', 'unit', 'lbs', 'oz', 'pound', 'gallon']
        },
        rate: {
            type: Number
        },
        stock: {
            type: Number
        },
        discount_type: {
            type: String,
            enum: ['special', 'daily', 'normal', '', ' ']
        },
        discount_percentage: {
            type: Number
        },
        start_date: {
            type: Date
        },
        end_date: {
            type: Date
        },
        discounted_rate: {
            type: Number,
            required: true
        },
        is_deleted: {
            type: Boolean,
            default: false
        },
        tax_percentage: {
            type: Number,
            default: 0
        },
        tax_value: {
            type: Number,
            default: 0
        }
    }],
}
  

Я хочу извлечь продукты, у которых available_in на складе меньше 10 и равно 0. Я попытался поместить запрос в $match , но, похоже, это не сработало.
Например: —
у меня есть 5 продуктов, и у 2 продуктов есть один объект в массиве available_in, в котором запас меньше 10 или 0, так как же получить эти 2 продукта с помощью агрегации mongo?
Есть идеи по этому поводу.?

Комментарии:

1. { $match: { «available_in.stock»: {$ lt: 10 } } }, вы пробовали это? не могли бы вы поделиться фрагментом кода того, что вы пробовали?

2. Спасибо, но, как я уже упоминал, available_in — это массив из нескольких объектов. Поэтому я не могу использовать приведенный выше код. @Tahero

3. попробуйте размотать available_in, а затем { $match: { «available_in.stock»: {$ lt: 10 } } }

Ответ №1:

Попробуйте это:

 db.collection.find({"availabe_in.stock" : {$lt : 10}})
  

или с помощью конвейера агрегации:

 db.collection.aggregate([{
     $match :{
          "availabe_in.stock" : {$lt : 10}
     }
}])
  

Примечание: 0 также меньше 10, поэтому вам не нужен какой-либо специальный or запрос для добавления equals to 0 условия

Если вы хотите получить только те элементы available_in массива, которые совпадают, вы можете использовать конвейер агрегации ниже:

 db.collection.aggregate([{
    $unwind : "$available_in"
},{
    $match : {
        "available_in.stock" : {
            $lt : 10
        }
    }
},{
    $group : {
        _id : "$_id",
        name : {$first : "$name"},
        available_in : {$push : "$available_in"}
    }
}])