#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"}
}
}])