【问题标题】:Nodejs Mongo creating collection model with a list of object where these objects are list as wellNodejs Mongo使用对象列表创建集合模型,其中这些对象也是列表
【发布时间】:2018-09-04 08:57:45
【问题描述】:

我想查询 Mongodb 以获取属于同一公司的所有汽车但是我不想搜索整个数据库然后检查每个汽车记录的公司名称 而是我想在我的 carGarage Mongo 收藏中的一个地方单独列出同一家公司的所有汽车的列表,这样我就可以一次获得整个列表。

这是我想要的模型:问题是这些公司名称不是硬编码的,也就是说,如果一个新条目进入数据库,我将不得不创建一个具有该名称的新列表对象。我认为这可以在 Nodejs 后端使用一些 if 条件来完成。

carsGarage {
    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 之后,主要是关于索引,我认为还有另一种方法可以做到这一点。所以现在我的结构是:

   carsGarage {

            car1 { bmw ,
                 Model,  Year, PriceInINR,  Trim,
                Engine, Body,color ,transmittion_type;
                dealer - id_2: <<
            },
            car2 {bmw ,
                Model,  Year, PriceInINR,  Trim,
                Engine, Body,color ,transmittion_type;
                dealer - id_2: <<
            },car3 {jaguar ,
                Model,  Year, PriceInINR,  Trim,
                Engine, Body,color ,transmittion_type;
                dealer - id_2: <<
            }


            car4 { bmw,
                Model,  Year, PriceInINR,  Trim,
                Engine, Body,color ,transmittion_type;
                dealer - id_2: <<
            },
            car5 { jaguar,
                Model,  Year, PriceInINR,  Trim,
                Engine, Body,color ,transmittion_type;
                dealer - id_2: <<
            }


            { ferrari -- -- --}
            { ferrari -- -- --}
            { ferrari -- -- --}

    }

这个想法是将公司名称作为索引:因为 mongo 在创建索引时指定,它单独存储它们以便可以更快地搜索,--> 索引不必是唯一的也可以是非唯一的

例如db.collection.createIndex( { name: -1 } , {unique = true}),但我们可以去掉 {unique = true} 选项 db.collection.createIndex( { name: -1 })

因此,当我找到任何公司的所有汽车时,我会更快地得到它。

我能想到的就这些了,我对不对,我怎样才能让我的模型更好,让我的搜索更快?

现在我在 nodejs 中的模型看起来像这样

"use strict";

const MONGOOSE = require("mongoose"),
      DB = MONGOOSE.connection;


let carGarageSchema = MONGOOSE.Schema({

      company: { 
            type: String,
            required: true
      },
      model: {
            type: String,
            required: true
      },
      year: {
            type: Number,
            required: true
      },
      PriceInINR: {
            type: Number,
            required: true
      },
      trim: {
            type: String,
            required: true

      },
      engine: {
            type: String,
            required: true
      },
      body: {
            type: String,
            required: true
      },
      color: {
            type: String,
            required: true
      },
      transmission: {
            type: String,
            required: true
      },
      dealer_id: {
            type: String,
            required: true
      }
});

let collection_name = "carsGarage";

let carGarageModel = MONGOOSE.model(collection_name, carGarageSchema);
createAscendingIndex_on_car_make(DB);

module.exports = carGarageModel;




//   indexing  at schema level -->  using node js
function createAscendingIndex_on_car_company(DB, callback) {
      let collection = DB.collection(collection_name); 

      // ? Create the index
      collection.createIndex({
            company: 1, // specifies : indexing type is ascending indexing
      }, function (err, result) {
            if (err) {
                  console.log(err);
            }
            // callback("result");
      });
}

【问题讨论】:

    标签: node.js database mongodb mongoose collections


    【解决方案1】:

    编辑:

    根据您的要求(您总是希望获得某家公司的所有汽车),我将创建一个名为“company”的文档,其中包含属于该公司的汽车列表。

    {
      "companyName" : "Ferrari",
      "compayAddress" : "Italy",
      "companyPhoneNumber": "+1288213123",
      "cars" : [
        {
          "model": "812 superfast",
          "year" : "",
          "PriceInINR" : "",
          "trim" : "",
          "engine" : "",
          "body" : "",
          "color" : "",
          "transmission": "",
          "dealer_id" : ""
        }
        ]
    }
    

    在这种情况下,查询应该非常简单。您只需查询公司名称,然后返回属于该公司的汽车列表。 该索引将在 companyName 中,并且是唯一的。

    如果您要插入新车,我会先检查公司是否存在,如果不存在,我将创建公司文档,然后将卡插入其中。

    注意: 你的方法也不错,但是由于 MongoDB 是一个面向文档的数据库,在这种情况下,你的数据有一个清晰的层次结构,我会按照我写的方式对其进行编码。

    【讨论】:

    • 您是否建议为每个公司创建一个新集合?当新车来的时候,如果它的集合不存在,那么首先做一个集合,然后添加到它。这是你的主意吗,
    • 不是一个集合,而是一个文档。该集合只是一个(公司),您最初可以将其创建为空。当一辆新车到来时,如果集合中没有汽车公司的文档,则创建它并将汽车放入其中。但无需创建多个集合。我希望很清楚:)
    • 好的,我知道了,所以我认为我应该将公司名称设为索引 -> 设置选项为唯一?你怎么看,它会提高速度吗?
    • 是的,我认为这是正确的方法。您可以轻松地在 companyName 中设置唯一索引。关于性能速度:老实说,每个汽车公司的汽车并不多,所以我认为您不会看到性能差异,您最多会查询 1000 个对象(?)。但是将所有汽车分组到一个文档中会带来其他好处,即它可能有用或没有用,具体取决于您的应用程序需求,我认为这是正确的数据模型。
    • 是的,你是对的,在我的公司集合中,最多只有 50 家公司,因此为 50 个元素创建索引是无用的并且浪费内存。 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多