Mongodb: find () запрос в коллекции

Mongodb: find () запрос в коллекции

Что у меня есть :

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

}

Похоже, вам нужно вынести машины в отдельную коллекцию.

JohnnyHK 09.09.2018 15:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
50
1

Ответы 1

Вы можете использовать агрегацию. $ расслабиться выведет документ для каждой машины. Тогда $ матч используется вместо найти() в вашем примере.

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

Другие вопросы по теме