node.js - mongodb : find() query in a collection

标签 node.js mongodb mongodb-query

**enter image description here**

我有什么:

 list of company names : [bmw, tata, ferrari,...]
 transmission: Manual or Automatic3.
 car color: Red or White etc
 model year: 2010 to 2014
 Min Price & Max Price. --> Price range

我现在能做什么:如果我只有一个对象(即公司中的一个公司),那么我会做类似的事情:

query = {{transmission_type : transmission}, {color : car_color}, {year : model_year}, { $range: [ 0, "$PriceInINR", 25 ] }  }

db.companies.cars.find(query)

但是这里首先有很多公司,然后每个公司都有一个汽车列表。

我怎样才能进行这样的查询?

  1. 我想要一个考虑价格范围的查询。
  2. 另一个没有价格范围条件。

早期想法:我认为我可以单独查询每个公司,因为我知道公司名称。因此单独查找结果然后将它们推送到数组中。

我应该怎么做,还有其他建议吗?

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"
            }
    ]

}

最佳答案

您可以使用聚合。 $unwind将为每辆车输出一个文档。然后$match在您的示例中用于代替 find()

const transmission = 'Manual'
const car_color = 'Yellow'
const model_year = 2013
const min_price = 3500000
const max_price = 4000000

const query = { 
    'cars.transmission_type': transmission, 
    'cars.color': car_color, 
    'cars.year': model_year, 
    'cars.PriceInINR': { '$gte': min_price, '$lte': max_price }
}

db.companies.aggregate([
    { '$unwind': '$cars' },
    { '$match': query }
])

关于node.js - mongodb : find() query in a collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52243910/

相关文章:

sockets - 我可以在 heroku 上设置 socket.io 聊天吗?

javascript - 如何使用 Vue.js(使用 Vueify)通过组件显示数据?

javascript - 为什么我对 server.js 的 get 请求返回 ionic - cloud 9 上的实际文件

node.js - NodeJS, Mongoose : How to get related data using mongoose

当我尝试从 Mongoose 访问 MongoDB 数据库时,Node.js Express 应用程序卡住

node.js - Node js错误 "process with a non-zero exit code"

mongodb - 按值排序项目 mongodb

node.js - 在node.js中如何在超时后关闭套接字?

mongodb - 如何返回两个字段具有相同值的文档

mongodb - Mongodb聚合$ group,限制数组的长度