[英]Find object by property in an array of JavaScript objects inside another array
[英]Mongoose | Find objects inside of an array, that each object has another array of objects to satisfy condition
我有一個集合Shops 。 Shops集合中的每個 object 都有一個名為items
的Item
對象數組。
{
_id: ObjectId(...),
shopName: 'Ice cream Shop',
items: [
<Item>{
itemName: 'Chocolate IC',
availabilities: [
{
city: 'NY',
arrivals: [
{
price: 3.99,
quantityLeft: 0,
date: 'yesterday'
},
{
price: 3.99,
quantityLeft: 40,
date: 'today'
}
]
},
{
city: 'LA',
arrivals: []
}
]
},
<Item>{
itemName: 'Strawberry IC',
availabilities: [
{
city: 'NY',
arrivals: [
{
price: 3.99,
quantityLeft: 0,
date: 'yesterday'
},
]
}
]
},
],
},
... anotherShops
我想從特定shop
獲取總 quantityLeft 大於 0 的Item
對象列表。 我嘗試使用此代碼從shopName
等於'Ice cream Shop'
的商店中獲取名稱以"Straw"
開頭的所有items
:
const items = await Shop.aggregate()
.match({
shopName: 'Ice cream Shop',
})
.project({
items: {
$filter: {
input: "$items",
as: "item",
cond: {
$regexMatch: {
input: "$$item.itemName",
regex: `.*Straw.*`,
},
},
},
},
});
它有效。 但我不知道如何對每個item
的availabilities
數組中的所有quantityLeft
值求和,並只返回總和大於 0 的items
。
availabilities
數組可以是空數組 []。
city
參數也需要符合條件。 例如,只有NY
有貨的商品
我需要這個來獲取某家商店的商品清單,並且只有仍有庫存的商品。 相當困難。
我想出了這個解決方案。 如果您有更好的解決方案,請發布。
const shop = await GCShop.aggregate([
{
$match: {
shopName: 'Ice Cream Shop',
},
},
{
$unwind: "$items",
},
{
$unwind: "$items.availabilities",
},
{
$unwind: "$items.availabilities.arrivals",
},
{
$group: {
_id: "$items.id",
items_name: { $first: "$items.name" },
arrivals: {
$push: {
arrival_id: "$items.availabilities.arrivals.arrival_id",
price: "$items.availabilities.arrivals.price",
qtty: "$items.availabilities.arrivals.qtty",
},
},
totalQtty: { $sum: "$items.availabilities.arrivals.qtty" },
},
},
{
$project: {
offer_id: "$_id",
_id: 0,
offer_name: 1,
totalQtty: 1,
arrivals: 1,
},
},
{
$match: {
totalQtty: {
$gt: 0,
},
},
},
]).limit(20);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.