获取猫鼬类型的所有文档,但每个文档数组仅包含一个特定项

Flavordaaave

我的REST API使用的是Express 4和Mongoose。因此,我有多个“商店”类型的文档。每个商店(除其他信息外)都保存一个称为“库存”的数组,该数组又包含多个项目。每个项目本身都有名称和价格之类的属性。

现在,我希望有一个API调用,在这里我可以得到所有商店,但只能使用json响应中的“最便宜”产品项。但是我完全陷入了创建返回我所有商店的查询的麻烦,而不是包括库存中的所有项目,而是只将价格最低的库存项目作为库存数组中的唯一项目。

我发现了一些如何使用以下查询来排除字段的提示,但整个数组将被排除:

Shop.find({},  {inventory: 0},function(err, shops) {
    if (err) {
        res.send(err);
    } else {
        res.json(shops);
    }
});

更新1:我的模式

// Shop
var ShopSchema = new Schema({
    name: { type: String, required: true},
    address: {
        street: String,
        zipCode: Number,
        city: String
    },
    inventory: [InventoryItemSchema]
});

// InventoryItem
var InventoryItemSchema = new Schema({
    name: { type: String, required: true},
    currentPrice: {
        amount: { type: Number, required: true },
        added: Date
    },
    pastPrices: []
});

更新2:这就是我的想法

Shop.find(function(err, shops) {
    if (err) {
        res.send(err);
    } else {

        shops.forEach(function(shop) {
            // Only keep the currently cheapest inventory Item in the array
            var cheapestInventoryItem;
            shop.inventory.reduce(function (previousItem, currentItem) {
                if (currentItem.currentPrice.amount < previousItem.currentPrice.amount) {
                    cheapestInventoryItem = currentItem;
                    return currentItem;
                } else {
                    cheapestInventoryItem = previousItem;
                    return previousItem;
                }
            });
            shop.inventory = [cheapestInventoryItem];
        });

        res.json(shops);
    }
});
拉克斯·温特

Mongodb的find方法返回一个文档。因此,在您的情况下,无论如何将是拥有折叠场的商店。

您可以使用js过滤项目:

var cheapestItem;
var cheapestPrice = shop.inventory.items.reduce(function (lowest, item) {
    if (item.price < lowest) {
        cheapestItem = item;
        return item.price;
    }
}, Infinity);

或者,您可以规范化架构并创建集合项:

[{itemId: 1, shopId: 1, price: 100}]

因此查询为:

db.Item.group(
{
     key: { shopId: 1, itemId: 1, price: 1 },
     reduce: function ( lowest, res ) { if (result.price < lowest) return result.price },
     initial: Infinity
})

因此,您必须以最低的价格获得shopId和itemId

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB嵌入式文档数组:仅获取一个具有特定属性的嵌入式文档

猫鼬对所有文档求和

猫鼬findByIdAndUpdate仅更新文档中的一个字段

猫鼬:更新特定文档数组的元素

猫鼬-获取得分最高但每位用户仅一个的文档

在文档数组猫鼬中获取精确的子文档

猫鼬$ in运算符仅更新一个文档

猫鼬:如何获取N个随机文档,然后再获取N个随机文档,而前一个批次没有重复

从MongoDB中的所有文档中获取数组字段的第一个元素的总和

在另一个子文档数组中的猫鼬增量子文档数组值

猫鼬计数文档,其中属性设置为false的数组元素的计数小于一个值

猫鼬:查找具有特定字段的所有文档

在猫鼬中,如何仅删除集合中找到的一个文档?

猫鼬获取匹配数组的文档

用猫鼬渲染所有文档的每个子文档

如何在猫鼬中仅获得一个子文档中的一项?

如何在一个数组猫鼬中存储不同的子文档?

如何在猫鼬中仅获取“唯一”子子文档,删除重复项?

仅获取数组猫鼬的最后一个元素

使用猫鼬为所有文档获取数组中对象的不同值

MongoDB:在一个文档中获取所有集合

如何查找其数组字段仅包含两个特定值的所有文档

猫鼬检索每种类型的一个文档

如何让猫鼬将一组 url 推送到一个数组子文档

更新猫鼬子文档数组中的所有项目

查找嵌套数组至少包含两个特定子文档的所有文档

只更改猫鼬中整个嵌入文档数组的一个字段

更新猫鼬文档中另一个数组内的数组中的字段

为什么猫鼬插入 null 作为子文档数组的最后一个元素?