我在MongoDB中使用带有node.js的mongoose。现在我需要在我的数据库中进行20个并行查找查询请求,文件限制为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放入一个字符串数组中,然后使用$ 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 {
}
}
);
任何人都可以告诉我如何只使用一个查询来解决我的问题。
更新 - 为什么我认为$ group对我有帮助。
假设我的brand_ids数组包含这些字符串
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个文件,其中"名称"作为" Levis"和25000个文件,其中" name"是" Lee",现在如果我将使用组,则将查询所有50000个文档并按" name"进行分组。
但根据我想要的解决方案,当第一份文件与" Levis"和" Lee"如果找到了,那么我将不必寻找剩下的数千份文件。
更新 - 我想如果你们中的任何人都能告诉我这一点,那么我可能会找到我的解决方案。
考虑一下我的mongoDB中有1000个文档的情况,现在假设1000个,100个将通过我的匹配查询。
现在,如果我将对此查询应用限制4,那么此查询将花费相同的时间来执行查询而不受任何限制。
为什么我在考虑这个案例
因为如果我的查询需要同一时间,那么我不认为$ group会增加我的时间,因为所有文档都会被查询。
但是,如果限制查询所花费的时间超过了没有限制查询所花费的时间,那么。
如果我可以对每个数组元素应用限制4,那么我的问题就会得到解决。
如果我不能对每个数组元素应用限制,那么我不认为$ group会有用,因为在这种情况下我必须扫描整个文档才能得到结果。
最终更新 - 正如我在下面的答案和mongodb文档中所读到的那样,通过使用$ limit,查询所花费的时间不会受到影响,因此网络带宽会受到影响。所以我想如果你们中的任何人都可以告诉我如何对数组字段应用限制(使用$ group或者除此之外的任何东西)那么我的问题就会得到解决。
mongodb: will limit() increase query speed?
解决方案 实际上我对mongoDB的看法是非常错误的,我认为通过查询添加限制可以减少查询所花费的时间,但事实并非如此我偶然发现这么多天来尝试Gregory NEUT和{{3告诉我。非常感谢你们两个人,如果我知道这件事,我必须在第一天找到解决方案。非常感谢帮助我离开这里的人我真的很感激。
答案 0 :(得分:2)
我建议您使用$group
聚合属性将$match
的所有数据分组到brand_id
,然后使用$slice
限制数据组。
Look at this stack overflow post
db.collection.aggregate(
{
$sort: {
created: -1,
}
}, {
$group: {
_id: '$city',
title: {
$push: '$title',
}
}, {
$project: {
_id: 0,
city: '$_id',
mostRecentTitle: {
$slice: ['$title', 0, 2],
}
}
})
答案 1 :(得分:0)
我建议使用distinct,因为这会返回您收藏中的所有different
品牌名称。 (我认为这是你想要实现的目标?)
db.runCommand ( { distinct: "areamodel", key: "name" } )
在mongoose我认为是:areamodel.db.db.command({ distinct: "areamodel", key: "name" })
(未经测试)