首页 > 解决方案 > MongoDB如何限制每个组/类别/条件的结果?

问题描述

假设我有一个产品库存数据库,说明每个产品实例的状态。

[
  { prod: A, location: 1, status: 1 },
  { prod: A, location: 1, status: 2 },
  { prod: A, location: 2, status: 1 },
  { prod: A, location: 3, status: 1 },
  { prod: B, location: 2, status: 2 },
  { prod: B, location: 1, status: 1 },
  { prod: B, location: 1, status: 2 },
  { prod: B, location: 1, status: 2 },
  { prod: C, location: 1, status: 1 }
]

我们有一些动态查询对,比如

[A: 2, B: 4]

其中数字是相应产品的结果限制。(意味着我们需要两个 As 和四个 B)(当然可以有 Cs 和 Ds 等)

现在我知道在聚合中我们可以匹配 status=1 和 prod %in% [A,B]。
我们可以对整个查询结果设置一个整体 $limit,比如只过滤 10 个条目。
而且 $slice 也没有用,因为它不能接受多个参数。

那么,我必须执行多个查询还是有一种有效的方法可以在一个聚合中执行此操作?

(我搜索了很多,似乎我们只有每个组的前 N ​​个结果的解决方案。
例如:mongodb 中的多个限制条件

编辑:

为了澄清,基本上我想要不同产品的不同限制。
这就是我能做的,使用 for 循环进行多个查询。
但是有没有办法在一个聚合中做到这一点而不循环

q = {A:2, B:4};
allResult = [];
Object.keys(q).forEach(k => {
    result = db.find({prod:k}).limit(q[k]).exec();  //find for one prod
    allResult = allResult.concat(result);
});

预期输出:
[
  { prod: A, location: 1, status: 1 },
  { prod: A, location: 1, status: 2 },
  { prod: B, location: 2, status: 2 },
  { prod: B, location: 1, status: 1 },
  { prod: B, location: 1, status: 2 },
  { prod: B, location: 1, status: 2 }
]

标签: node.jsmongodbexpressaggregation-framework

解决方案


推荐阅读