Node.js 如何实现对书名、isbn和作者的搜索?
我正在为图书搜索应用程序开发一个节点MongoDb后端。我存储图书信息,如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位数的数字,然后
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 }