node.js - MONGO:艰难的 find() 查询,提供了很好的解释
问题描述
我有的 :
- 公司名称列表:[bmw, tata, ferrari,...]
- 传输:手动或自动3。
- 汽车颜色:红色或白色等
- 车型年 : 2010 至 2014
- 最低价格和最高价格。--> 价格范围
==================================================== ==========================
我现在能做什么:如果我只有一个对象(即一家公司companies
),那么我会做类似的事情:
query = {{transmission_type : transmission}, {color : car_color}, {year : model_year}, { $range: [ 0, "$PriceInINR", 25 ] } }
db.companies.cars.find(query)
但是 这里首先有很多公司,然后每个公司都有汽车清单。
我怎么能做这样的查询。
我想要一个考虑价格范围的查询。
另一个没有价格范围条件。
早期想法:我认为我可以单独查询每家公司,因为我知道公司名称。因此单独查找结果,然后将其推送到数组中。
我该怎么做,还有其他建议吗?
==================================================== ==========================
companies
集合的伪结构
Companies {
bmw: [
car1 {
Model, Year, PriceInINR, Trim,
Engine, Body,color ,transmittion_type;
dealer - id_2: <<
},
car2 {
Model, Year, PriceInINR, Trim,
Engine, Body,color ,transmittion_type;
dealer - id_2: <<
},car3 {
Model, Year, PriceInINR, Trim,
Engine, Body,color ,transmittion_type;
dealer - id_2: <<
}
],
jaguar: [
car1 {
Model, Year, PriceInINR, Trim,
Engine, Body,color ,transmittion_type;
dealer - id_2: <<
},
car2 {
Model, Year, PriceInINR, Trim,
Engine, Body,color ,transmittion_type;
dealer - id_2: <<
}
],
ferrari [
{-- -- --}
{-- -- --}
{-- -- --}
]
}
==================================================== ==========================companies
mongo db
中集合的实际结构
{
"_id" : ObjectId("5b8ef8b78cc390cca71aa0e5"),
"company_location" : "USA",
"company_name" : "buick",
"__v" : 0,
"cars" : [
{
"_id" : ObjectId("5b8ef8b6d1a7c2156417de56"),
"model" : "ENCLAVE",
"year" : 2014,
"PriceInINR" : 2537993,
"trim" : "Leather FWD",
"engine" : "SPORT UTILITY 4-DR",
"body" : "3.6L V6 DOHC 24V",
"color" : "Silver",
"transmission_type" : "Manual",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef8b6d1a7c2156417de5d"),
"model" : "LaCrosse",
"year" : 2011,
"PriceInINR" : 4677427,
"trim" : "CXL FWD",
"engine" : "SEDAN 4-DR",
"body" : "3.6L V6 DOHC 24V",
"color" : "Grey",
"transmission_type" : "Automatic",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef8b7d1a7c2156417de8e"),
"model" : "ENCORE",
"year" : 2013,
"PriceInINR" : 4808616,
"trim" : "Leather FWD",
"engine" : "SPORT UTILITY 4-DR",
"body" : "1.4L L4 DOHC 16V TURBO",
"color" : "Yellow",
"transmission_type" : "Manual",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef8b7d1a7c2156417dece"),
"model" : "LaCrosse",
"year" : 2011,
"PriceInINR" : 868875,
"trim" : "CXL FWD",
"engine" : "SEDAN 4-DR",
"body" : "2.4L L4 DOHC 16V",
"color" : "Grey",
"transmission_type" : "Automatic",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef9c1f0412315aa07b65a"),
"model" : "VERANO",
"year" : 2013,
"PriceInINR" : 4380113,
"trim" : "Base",
"engine" : "SEDAN 4-DR",
"body" : "2.4L L4 DOHC 16V FFV",
"color" : "Metallic White",
"transmission_type" : "Automatic",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
}
]
}
{
"_id" : ObjectId("5b8ef8b78cc390cca71aa0e7"),
"company_location" : "USA",
"company_name" : "gmc",
"__v" : 0,
"cars" : [
{
"_id" : ObjectId("5b8ef8b6d1a7c2156417de57"),
"model" : "TERRAIN",
"year" : 2013,
"PriceInINR" : 3851710,
"trim" : "SLE2 FWD",
"engine" : "SPORT UTILITY 4-DR",
"body" : "2.4L L4 DOHC 16V FFV",
"color" : "Yellow",
"transmission_type" : "Manual",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef8b6d1a7c2156417de5b"),
"model" : "YUKON",
"year" : 2015,
"PriceInINR" : 3129397,
"trim" : "SLE 2WD",
"engine" : "SPORT UTILITY 4-DR",
"body" : "5.3L V8 OHV 16V",
"color" : "Silver",
"transmission_type" : "Manual",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef9c1f0412315aa07b659"),
"model" : "SIERRA 1500",
"year" : 2014,
"PriceInINR" : 3649025,
"trim" : "SLE Crew Cab 2WD",
"engine" : "CREW CAB PICKUP 4-DR",
"body" : "5.3L V8 OHV 16V",
"color" : "Metallic White",
"transmission_type" : "Automatic",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef9c1f0412315aa07b666"),
"model" : "TERRAIN",
"year" : 2012,
"PriceInINR" : 1896832,
"trim" : "SLT1 FWD",
"engine" : "SPORT UTILITY 4-DR",
"body" : "3.0L V6 DOHC 24V",
"color" : "Metallic White",
"transmission_type" : "Automatic",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
},
{
"_id" : ObjectId("5b8ef9c1f0412315aa07b650"),
"model" : "ACADIA",
"year" : 2012,
"PriceInINR" : 2541355,
"trim" : "Denali AWD",
"engine" : "SPORT UTILITY 4-DR",
"body" : "3.6L V6 DOHC 24V",
"color" : "Metallic White",
"transmission_type" : "Automatic",
"dealer_id" : "5b8ee03ffe42df0d94de785d"
}
]
}
解决方案
对于您的数据和所需的查询,我建议如下:
// I've tried to annotate without being too verbose
db.companies.aggregate([
{ $match: { company_name: { $in: [...] } } }, // match company names
{ $unwind: "$cars" }, // separate cars array into distinct documents
{ $replaceRoot: { newRoot: "$cars" } }, // remove company information so it just has car information
{
$match: { // match car information
transmission_type: "", // any one of these can be omitted
color: "",
year: 0,
PriceInINR: { $gt: 0, $lt: 0 }
}
}
])
在旁注中,我发现您的数据结构非常奇怪。通常,您希望避免嵌套的对象数组,尤其是当您要对它们进行许多查询时。
推荐阅读
- python - 无法使用 Pyinstaller 将 Python 脚本转换为可执行文件:空 dist 文件夹和找不到 PyQt5
- ruby-on-rails - 为什么 rake 任务不通过 cron 运行?
- java - Wiremock JSON 响应模板 - 查询中的查询
- excel - Selenium - NG-IF 还是 Next Element?
- mysql - 使用通配符选择以特定字符开头的名称不起作用
- arrays - 排序数组并维护索引
- c++ - Fuse 回调在某些 Azure API 调用上永远挂起
- c# - 使用 GZipStream 压缩字符串而不使用 Base64
- django - 用多对一关系序列化模型中的字段
- python - Python-Selenium-WebDriver 该页面正在滚动过去的元素而不“单击”它们,即使驱动程序应该