将多个查询与一个$ in查询组合在一起,并为每个数组字段指定限制?

我正在MongoDB中使用mongoose和node.js。 现在我需要在我的数据库中find20个并行查询请求,限制文档4,如下所示,只是brand_id会因不同品牌而改变。

areamodel.find({ brand_id: brand_id }, { '_id': 1 }, { limit: 4 }, function(err, docs) { if (err) { console.log(err); } else { console.log('fetched'); } } 

现在为了平行运行所有这些查询,我想将所有20个brand_id放在一个string数组中,然后使用$ in查询来获得结果,但是我不知道如何为每个数组字段指定限制4匹配。

我写下面的代码与聚合,但不知道在哪里指定我的数组中的每个元素的限制。

 var brand_ids = ["brandid1", "brandid2", "brandid3", "brandid4", "brandid5", "brandid6", "brandid7", "brandid8", "brandid9", "brandid10", "brandid11", "brandid12", "brandid13", "brandid14", "brandid15", "brandid16", "brandid17", "brandid18", "brandid19", "brandid20"]; areamodel.aggregate( { $project: { _id: 1 } }, { $match : { 'brand_id': { $in: brand_ids } } }, function(err, docs) { if (err) { console.error(err); } else { } } ); 

任何人都可以请告诉我如何解决我的问题只使用一个查询。

更新 – 为什么我不认为$组对我有帮助。

假设我的brand_ids数组包含这些string

 brand_ids = ["id1", "id2", "id3", "id4", "id5"] 

和我的数据库有下面的文件

 { "brand_id": "id1", "name": "Levis", "loc": "india" }, { "brand_id": "id1", "name": "Levis" "loc": "america" }, { "brand_id": "id2", "name": "Lee" "loc": "india" }, { "brand_id": "id2", "name": "Lee" "loc": "america" } 

所需的JSON输出

 { "name": "Levis" }, { "name": "Lee" } 

对于上面的例子,假设我有25000个“name”为“Levis”的文档,25000个文档中的“name”是“Lee”,现在如果我将使用group,那么所有的50000个文档将被“name”查询和分组。

但根据我想要的解决scheme,当“Levis”和“Lee”的第一个文件被发现时,我将不必再寻找剩余的数千个文件。

更新 – 我想如果你们中的任何人都可以告诉我这个,那么我可以find我的解决scheme。

考虑一个案例,我有我的mongoDB中的1000个文件总数,现在假设1000,100将通过我的匹配查询。

现在,如果我将这个查询应用限制4,那么这个查询将花费相同的时间执行查询没有任何限制,或不。

为什么我在想这个案子

因为如果我的查询需要相同的时间,那么我不认为$ group会增加我的时间,所有的文件将被查询。

但是,如果限制查询花费的时间超过没有限制查询的时间,那么。

  • 如果我可以对每个数组元素应用限制4,那么我的问题就会解决。

  • 如果我不能对每个数组元素应用限制,那么我不认为$组将是有用的,因为在这种情况下,我必须扫描整个文档以获得结果。

最后更新 – 当我读下面的答案和mongodb文档,通过使用$限制,查询所花费的时间不会受到影响,这是networking带宽受到威胁。 所以我想如果你们中的任何人都可以告诉我如何在数组字段上应用限制( 通过使用$ group或其他任何东西 ),那么我的问题将得到解决。

mongodb:会限制()提高查询速度吗?

解决scheme其实我对mongoDB的想法是错误的,我认为增加查询的限制减less了查询所花费的时间,但事实并非如此,为什么我偶然发现这么多天来尝试Gregory NEUT和JohnnyHK告诉我的答案。 非常感谢你们两位,如果我知道这件事的话,我一定在第一天就find了解决办法。 非常感谢帮助我离开这里家伙我真的很感激它。

我build议你使用$group aggregation属性将你从$match得到的所有数据按brand_id ,然后使用$slice限制数据组。

看看这个堆栈溢出post

 db.collection.aggregate( { $sort: { created: -1, } }, { $group: { _id: '$city', title: { $push: '$title', } }, { $project: { _id: 0, city: '$_id', mostRecentTitle: { $slice: ['$title', 0, 2], } } }) 

我build议使用不同的,因为这将返回您的collections中的所有different品牌名称。 (我认为这是你正在努力实现的?)

 db.runCommand ( { distinct: "areamodel", key: "name" } ) 

MongoDB文档

在mongoose中,我认为它是: areamodel.db.db.command({ distinct: "areamodel", key: "name" }) (未testing)