我有一个基本的express应用,我正在开始使用数据库查询,我想知道如何避免多个数据库查询,因为我认为这样做的效率不高:
app.get('/:word', function(req,res){
db.create({'name': word});
console.log('the word is ' + word);
});
我想做的是:
我只想将每个单词添加到我的数据库一次,而不是一次又一次地运行数据库查询。
我在想什么:
不是那么有效的方法 查询以检查是否存在,然后再插入一个
好方法,但我不知道如何从这里开始 缓存要查询的单词并保持缓存以防止数据库查询
更多信息编辑
我通过mongoose使用mongodb “单词”键已经是唯一的,所以我知道它不会创建重复的值
如果该值或该URL已经被命中一次,我不想运行任何数据库查询
答案 0 :(得分:0)
检查单词是否已存在的唯一方法是在插入之前查询数据库。有一些实现findOrCreate
方法的库(还有数据库),但这始终只是一个抽象。在后台,数据库将在写入之前搜索现有值。
如果数据库庞大且不适合查询,则您可以使用现金系统(例如Redis)。但这绝对取决于您的逻辑和数据大小。
也许您可以添加并索引要唯一的列来优化流程(我猜它是name
?)。
您还可以将列name
定义为唯一。插入时,如果文档已经存在,数据库将向您抛出错误。但是要再次记住,在幕后,数据库在插入之前正在查询现有的相同值。拥有“唯一”列的优点是该列的索引是自动创建的,并且还可以从您的应用程序逻辑(节点js)中调用插入方法并添加一点错误处理逻辑。
答案 1 :(得分:0)
MongoDB将创建您在应用程序中使用的所有集合(如果尚不存在)。
答案 2 :(得分:0)
插入唯一值:
为您的密钥创建Unique Index,以便仅将值添加一次。如果您尝试再次添加,则会向您抛出错误。
要创建唯一索引,
db.collection.createIndex( { "name": 1 }, { unique: true } )
缓存:
对于缓存,第一次将数据从MongoDB查询时,将数据存储在缓存系统中(例如:memory-cache,redis),然后对于随后的数据需求,可以使用缓存系统。 / p>
答案 3 :(得分:0)
在mongo db中,您可以使用带有可选标志upsert的findOneAndUpdate:true documentation
为确保每个单词仅出现一次,您还应该在该字段上设置唯一索引。但是,唯一索引区分大小写,因此Cat和cat是不同的单词。