【问题标题】:MONGO : Tough find() query, good explanation providedMONGO:艰难的 find() 查询,提供了很好的解释
【发布时间】:2018-09-09 06:25:24
【问题描述】:

我有什么:

  1. 公司名称列表:[bmw, tata, ferrari,...]
  2. 传输:手动或自动3。
  3. 汽车颜色:红色或白色等
  4. 车型年:2010 年至 2014 年
  5. 最低价格和最高价格。 --> 价格范围

============================================== ================================

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

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

db.companies.cars.find(query)

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

我该如何做这样的查询

  1. 我想要一个考虑价格范围的单一查询。

  2. 另一个没有价格范围条件。

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

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

============================================== ================================

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 [
            {-- -- --}
            {-- -- --}
            {-- -- --} 
        ]   
}

============================================== ================================ mongo db中companies集合的实际结构

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

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    对于您的数据和所需的查询,我建议如下:

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

    顺便说一句,我发现你的数据结构很奇怪。通常,您希望避免嵌套的对象数组,尤其是当您要对它们进行许多查询时。

    【讨论】:

    • 它给出的错误,我删除了额外的},但是,imgur.com/a/klMyc2u,我做了这个结构,认为它会减少汽车的数量需要搜索,例如。如果我假设有 50 家公司,每个公司都有 5000 辆汽车,那么如果我对汽车和公司都有不同的收藏,那么我现在需要从所有 50 * 5000 辆汽车中搜索汽车,如果我将所有汽车与他们各自的公司联系起来,然后我只需要在该公司搜索汽车,即只有 5000 辆汽车。这是我的方法,您还有其他建议吗?
    • 更新了查询,括号'是对的,但是缺少$s
    • 它的数据量相同,因此在这方面不会真正影响数据库。设置适当的索引将减少 50*5000 问题。在这种情况下,您将拥有具有其 company_id 的个别汽车,并且在搜索汽车时会使用它...如果 company_id 上有索引,它可以先搜索索引而不必查看 所有的汽车。我说你应该分开你的文件,因为从长远来看,当你想操纵汽车时,你会让自己变得困难,有时你并不总是想先通过公司。
    • 如果您想根据他们的dealer_id 获得汽车,您必须通过与上述相同的聚合(这对数据库不是特别友好)来获得您想要的。如果汽车是他们自己的收藏,那么查询会更好......
    • 你说得对,谢谢你的建议,我这样做是因为我不太了解monog,我只研究了rdbms,所以习惯于寻找关系,这里我们无法实现关系,所以我采取了这种方法,特别是我不能直接去汽车,我需要通过公司,我已经面临这个问题了.. 感谢您的建议 总有一天我会改变它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2020-12-02
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多