Node.JS / Express-如何避免多个数据库查询

时间:2019-03-20 10:59:44

标签: node.js mongodb

我有一个基本的express应用,我正在开始使用数据库查询,我想知道如何避免多个数据库查询,因为我认为这样做的效率不高:

app.get('/:word', function(req,res){

    db.create({'name': word});

    console.log('the word is ' + word);
});

我想做的是:

  1. 从网址中获取单词
  2. 检查它是否存在于datbaase中(或之前曾被要求,因为如果已经存在,则可能已经通过此基本代码添加了它)
  3. 如果不存在,请添加它,然后进入console.log

我只想将每个单词添加到我的数据库一次,而不是一次又一次地运行数据库查询。

我在想什么:

不是那么有效的方法 查询以检查是否存在,然后再插入一个

好方法,但我不知道如何从这里开始 缓存要查询的单词并保持缓存以防止数据库查询

更多信息编辑

我通过mongoose使用mongodb “单词”键已经是唯一的,所以我知道它不会创建重复的值

如果该值或该URL已经被命中一次,我不想运行任何数据库查询

4 个答案:

答案 0 :(得分:0)

检查单词是否已存在的唯一方法是在插入之前查询数据库。有一些实现findOrCreate方法的库(还有数据库),但这始终只是一个抽象。在后台,数据库将在写入之前搜索现有值。

如果数据库庞大且不适合查询,则您可以使用现金系统(例如Redis)。但这绝对取决于您的逻辑和数据大小。

也许您可以添加并索引要唯一的列来优化流程(我猜它是name?)。

您还可以将列name定义为唯一。插入时,如果文档已经存在,数据库将向您抛出错误。但是要再次记住,在幕后,数据库在插入之前正在查询现有的相同值。拥有“唯一”列的优点是该列的索引是自动创建的,并且还可以从您的应用程序逻辑(节点js)中调用插入方法并添加一点错误处理逻辑。

答案 1 :(得分:0)

MongoDB将创建您在应用程序中使用的所有集合(如果尚不存在)。

答案 2 :(得分:0)

插入唯一值:

为您的密钥创建Unique Index,以便仅将值添加一次。如果您尝试再次添加,则会向您抛出错误。

要创建唯一索引,

db.collection.createIndex( { "name": 1 }, { unique: true } )

缓存:

对于缓存,第一次将数据从MongoDB查询时,将数据存储在缓存系统中(例如:memory-cacheredis),然后对于随后的数据需求,可以使用缓存系统。 / p>

答案 3 :(得分:0)

在mongo db中,您可以使用带有可选标志upsert的findOneAndUpdate:true documentation

为确保每个单词仅出现一次,您还应该在该字段上设置唯一索引。但是,唯一索引区分大小写,因此Cat和cat是不同的单词。