【问题标题】:MongoDB - searches are slow with connected collectionsMongoDB - 连接集合的搜索速度很慢
【发布时间】:2019-10-12 14:53:54
【问题描述】:

我的 MongoDB 数据库中有多个集合。

定期搜索一个集合很好。但是搜索与其他集合有关系的集合显然很慢。我是系统上唯一的一个,DB 和 express 应用程序都在同一台笔记本电脑上。搜索大约需要 3 秒。

这里是有问题的集合:

var mongoose = require("mongoose");

var visitSchema = new mongoose.Schema({
    Study: {type: mongoose.Schema.Types.ObjectId, ref: "study"},
    Site:  {type: mongoose.Schema.Types.ObjectId, ref: "site"},
    Subject: {type: mongoose.Schema.Types.ObjectId, ref: "subject"},
    Phase: {type: mongoose.Schema.Types.ObjectId, ref: "phase"},
    Visit_date: Date
},{ strict: false });


module.exports = mongoose.model("visit", visitSchema);

进行搜索的路线

router.get("/visit/subject/:id", middleware.isLoggedin, function(req,res){
    visit.find({ Subject: req.params.id }).populate("Study").populate("Site").populate("Phase").populate("Subject").sort('Visit_date').exec(function(err,returnedvisits){
        var returnedsubjects = [];
        if(err){
            console.log(err);
        } else {
            console.log(returnedvisits);
            res.render("visit", {returnedvisits: returnedvisits, returnedsubjects: returnedsubjects});
        }
    });
});

仅返回 2 条记录,但从其他集合中获取相关数据:

[ { _id: 5d9e1bdec73b3c34c0b97bb9,
    Subject:
     { _id: 5d8e42f200c09107744bd8c0,
       Subject_Name: 'Virat Kohli',
       Subject_DOB: 1979-10-24T00:00:00.000Z,
       Subject_Address: '14 Coakwell drive',
       Subject_City: 'Toronto',
       Subject_Prov: 'ON',
       Subject_zip: 'L6B 0L7',
       Subject_Country: 'Canada',
       __v: 0 },
    Study:
     { _id: 5d9e1bc3c73b3c34c0b97bb8,
       Study_short_name: 'CCR',
       Study_name: 'Cancel Cell Research',
       __v: 0 },
    Site:
     { _id: 5d9635a6e5ede964f4394447,
       Site_short_name: 'MCR',
       Site_name: 'Microsoft',
       __v: 0 },
    Phase:
     { _id: 5d93bd727d0a484b04317b68,
       Phase_number: 1,
       'Phase Description': 'Phase 1',
       __v: 0 },
    Visit_date: 2018-10-10T04:00:00.000Z,
    __v: 0 },
  { _id: 5d9e1bf6c73b3c34c0b97bba,
    Subject:
     { _id: 5d8e42f200c09107744bd8c0,
       Subject_Name: 'Virat Kohli',
       Subject_DOB: 1979-10-24T00:00:00.000Z,
       Subject_Address: '14 Coakwell drive',
       Subject_City: 'Toronto',
       Subject_Prov: 'ON',
       Subject_zip: 'L6B 0L7',
       Subject_Country: 'Canada',
       __v: 0 },
    Study:
     { _id: 5d9e1bc3c73b3c34c0b97bb8,
       Study_short_name: 'CCR',
       Study_name: 'Cancel Cell Research',
       __v: 0 },
    Site:
     { _id: 5d9635a6e5ede964f4394447,
       Site_short_name: 'MCR',
       Site_name: 'Microsoft',
       __v: 0 },
    Phase:
     { _id: 5d94abb5092b7333b472b0f6,
       Phase_number: 2,
       'Phase Description': 'Phase 2',
       __v: 0 },
    Visit_date: 2019-11-11T05:00:00.000Z,
    __v: 0 } ]

它应该这么慢吗?我知道 MongoDB 不是用于报告的。但是像这样有点复杂的查询呢?

有什么选择? - 我应该将这些数据保存在一个集合中以便搜索更快吗? - 索引会有帮助吗?

谢谢!

【问题讨论】:

    标签: mongodb performance express mongoose


    【解决方案1】:

    由于您只有 2 条记录,最佳方法是将 Study、Site、Subject 和 Phase 文档嵌入到同一个主文档中。你没有制作那么多副本。

    MongoDB One-By-Many 文档中也建议这样做。

    或者,如果您的记录数量开始增加,只需在该 ID 上的每个集合(主题、阶段、研究、站点)中创建一个索引,然后看看您的性能提高了多少。这应该会带来很好的好处。

    【讨论】:

      【解决方案2】:

      尝试将日期时间格式更改为字符串或小日期时间。它对性能有很大帮助。 https://www.mongodb.com/blog/post/fast-datetimes-in-mongodb

      【讨论】:

      • 如果我这样做,我将无法根据日期进行计算,对吗?我不想冒这个风险,因为我在历史上经历过“报告”要求永远不会在某一时刻结束。不知道什么时候我必须在日期上做一个差异:)
      • Datetime tiny 让您对日期和大多数标准操作进行比较
      • 它(日期时间很小)似乎只在 CPAN 中。猫鼬没有。日期是我唯一的日期选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      相关资源
      最近更新 更多