Node.js 如何实现对书名、isbn和作者的搜索?

Node.js 如何实现对书名、isbn和作者的搜索?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在为图书搜索应用程序开发一个节点MongoDb后端。我存储图书信息,如ISBN、作者、标题、出版商、位置等。我实现了标题搜索,如下所示: const bookTitle= new RegExp(escapeRegex(request.params.query), 'gi'); 然后使用.find方法进行{title:bookTitle}搜索 我想从更高的层次上理解如何使用户能够输入作者、isbn或标题,并能够在MongoDb中搜索这些属性 我一直在考虑检查查询是否是一个10位数的数字,然后

我正在为图书搜索应用程序开发一个节点MongoDb后端。我存储图书信息,如ISBN、作者、标题、出版商、位置等。我实现了标题搜索,如下所示:

const bookTitle= new RegExp(escapeRegex(request.params.query), 'gi');
然后使用.find方法进行{title:bookTitle}搜索

我想从更高的层次上理解如何使用户能够输入作者、isbn或标题,并能够在MongoDb中搜索这些属性


我一直在考虑检查查询是否是一个10位数的数字,然后进行isbn搜索以查找该案例?我走对了吗?

当然有多种解决方案。假设您希望执行
查询(即,返回查询术语与
作者
标题
ISBN
匹配的结果),您可以使用适当的索引和运算符执行此操作

我很可能会从一个集合开始,将这些领域中的每一个单独地进行分类:

{
“_id”:7,
“标题”:“咖啡和奶油”,
“作者”:“约翰·多伊”,
“isbn”:12318
}
db.articles.createIndex({作者:1})
db.articles.createIndex({isbn:1})
db.articles.createIndex({title:“text”})
您需要在每个字段上添加索引…查看
文本
索引类型,这对
标题
字段非常有用(注意,每个集合只能使用一个
$text
索引)。另外,请阅读关于哪些内容对查询
作者有用的信息

当您得到一个查询词时,只需查询所有字段。然后,
$或
查询将返回与这些字段匹配的结果

获取并修改此解决方案的…假设有以下记录:

{ "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50, "isbn" : 12312312 }
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5, "isbn" : 12312313 }
{ "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90, "isbn" : 12312314 }
{ "_id" : 4, "subject" : "baking", "author" : "xyz", "views" : 100, "isbn" : 12312315 }
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200, "isbn" : 12312316 }
{ "_id" : 6, "subject" : "Сырники", "author" : "jkl", "views" : 80, "isbn" : 12312317 }
{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10, "isbn" : 12312318 }
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10, "isbn" : 12312319 }
{ "_id" : 10, "subject" : "The Coffee Book: Anatomy of an Industry from Crop to the Last Drop", "author" : "Nina Luttinger", "isbn" : 1595580603 }
搜索作者: 搜索标题:
您还可以在服务器端执行一些基本逻辑来检查查询项是否为整数,并从搜索中删除
isbn
query操作符,或者如果查询为整数,则只查询
isbn
。这意味着上面的查询将不包含
$或
查询列表中的
isbn
字段。

我认为的另一件事是创建另一个存储isbn+''+作者+''+标题的属性。这样我可以执行一次搜索。
> db.articles.find({ $or: [ 
     { $text: { $search: "lutt" } }, 
     { isbn: 'lutt' }, 
     { author: /lutt/i } 
  ] } )
{ "_id" : 10, "subject" : "The Coffee Book: Anatomy of an Industry from Crop to the Last Drop", "author" : "Nina Luttinger", "isbn" : 1595580603 }
> db.articles.find({ $or: [ 
     { $text: { $search: "cafe" } }, 
     { isbn: 'cafe' }, 
     { author: /cafe/i } 
  ] } )
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200, "isbn" : 12312316 }
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10, "isbn" : 12312319 }