【发布时间】:2021-09-19 18:14:59
【问题描述】:
有一个带有搜索输入的应用程序,可以通过存储在数据库中的信息来搜索联系人。
例如,我可以输入0972133122 Alan,我的搜索引擎必须返回所有firstname 为Alan 且号码与0972133122 字符串匹配的联系人。
当然,例如,我可以只输入Alan 0972,并且必须返回与此模式匹配的所有可能联系人。查询顺序可能不同,这样我就可以输入0972 Alan Smith,如果有2 个联系人姓名为Alan 并且电话号码以0972 开头,那么额外的Smith 澄清应该返回唯一的1 个联系人。
我建议内置的 Android 手机应用程序使用此搜索算法:
所以我的目标是达到类似的结果,但我知道如何做到这一点。这是我的代码:
GraphQL 查询
query contacts {
contacts(input: {
contactQuery: "Alan Smith"
}) {
name {
firstName
lastName
}
}
}
NodeJS 查询到 MongoDB
const conditions = {};
const expr = contactQuery
.split(' ')
.map((contact) => new RegExp(`${contact}`, 'i'))
conditions.$or = [
{ 'firstName': { $in: expr } },
{ 'lastName': { $in: expr } },
{ 'university': { $in: expr } },
{ emails: { $elemMatch: { email: { $in: expr } } } },
{ phones: { $elemMatch: { phone: { $in: expr } } } },
{ socials: { $elemMatch: { id: { $in: expr } } } },
]
const contacts = await this.contacts
.find(conditions, undefined)
.exec()
这部分工作,但我从 MongoDB 收到不需要的文档:
{
contacts: [
{
firstName: "Alan",
lastName: "Smith",
university: "KNTU",
...
},
{
firstName: "Alan",
lastName: "Alderson", // should not be returned
university: "ZNU",
...
},
...
]
}
但我需要找到一位严格遵守 Alan firstname 和 Smith lastname 的联系人。如果无法使用 MongoDB,请提供一个 SQL 查询示例。任何建议和解决方案都将被接受!
如果我的问题还不清楚,请告诉我。
【问题讨论】:
-
在 SQL 中您可以执行
WHERE firstname = 'Alan' AND lastname = 'Smith',看起来您当前的查询正在应用OR而不是AND -
可以有多个字段。我可以用
Alan Smith KNTU澄清我的疑问,这样如果有另一个艾伦史密斯在另一所大学(不是 ZNTU)学习,我应该收到唯一一个在 KNTU 学习的联系人。 可能有很多字段,我的应用程序无法确切知道客户端传递了哪些字段。 -
如果我输入
ZNTU Smith,-- 应该有匹配此模式的联系人。但是我的应用不知道字段的确切顺序,也不知道它们有多少。
标签: sql node.js mongodb mongoose