我正在开发一个Node - MongoDb后端,用于图书搜索应用程序。我正在存储书籍信息,如ISBN,作者,标题,出版商,位置等。我实施了标题搜索如下:
const bookTitle= new RegExp(escapeRegex(request.params.query), 'gi');
然后使用.find方法进行{title:bookTitle}搜索。
我想从高层次了解如何使其成为可能,以便用户可以输入author,isbn或标题,并能够在MongoDb中搜索这些属性。
我正在考虑检查查询是否是一个10位数的数字,然后在isbn搜索那个案例?我在正确的轨道上吗?
答案 0 :(得分:0)
当然,有多种解决方案。假设您要执行<testfile.txt a.exe 1
查询(即,返回查询字词与OR
或author
或title
匹配的结果),您可以使用正确的索引和the $or运算符。
我可能会从一个集合中开始,这个集合突破了这些领域中的每个人:
ISBN
您需要在每个字段上添加索引...查看{
"_id" : 7,
"title" : "coffee and cream",
"author" : "John Doe",
"isbn" : 12312318
}
db.articles.createIndex( { author : 1 } )
db.articles.createIndex( { isbn : 1 } )
db.articles.createIndex( { title: "text" } )
索引类型和$text
queries,这对{{1}真正有帮助} field(注意,每个集合只能使用一个 text
索引。另请阅读indexes work with $regex queries如何查询title
。
获得查询字词时,只需查询所有字段即可。然后,$text
查询将返回与这些字段中的任何字段匹配的结果
取example in the $text documentation并为此解决方案修改它...假设以下记录:
author
$or
{ "_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 }
您还可以在服务器端执行一些基本逻辑,以检查查询字词是否为整数,并从查询中删除> 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 }
查询运算符 only {{ 1}}如果查询是整数。这意味着上述查询根本不会包含> 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 }
个查询列表中的isbn
字段。