【发布时间】:2019-08-16 16:23:26
【问题描述】:
我在一个数组字段上有一个文本索引,这是该字段的样子:
{"client":["Aaaa","Bbbb"]},
{"client":["Ccc","Dddd"]},
{"client":["Ccc","Dddd"]},
{"client":["Aaaa","Bbbb"]},
{"client":["Ccc","Dddd"]},
{"client":["Aaaa","Bbbb"]},
{"client":["Ccc","Dddd"]},
并且我需要通过搜索我想要排除的值而不是添加我想要包含的值来获取所有没有 Dddd 的记录 Aaaa 和 -Bbbb
我在这里读到,mongoDB Docs: $text,我可以通过在要排除的单词前添加破折号来排除某些结果,但我不知道如何仅排除。
db.clients.find({$text:{$search: 'Aaaa -Dddd'}})
工作,但我需要做类似的事情:
db.clients.find({$text:{$search: '-Dddd'}})
我希望能够从搜索中排除一个客户,而无需添加我想保留的所有其他客户 :)
所以查询的输出应该是客户端不是{"client":["Ccc","Dddd"]}的所有文档
该数组是客户名称、位置和部门,所以下面是一个真实的例子:客户的样子:
"client":["Microsoft","Washington","Data Analytics"],
"client":["Microsoft","Washington","Hardware Devices Research Group"],
"client":["Dell","Washington","Interactive 3D", "Technologies Research Group (I3D)"],
"client":["MSI","Washington","Interactive 3D", "Media Research Group"],
我需要能够接受输入(不区分大小写)并排除所有具有该客户端的文档,因此例如,我想要所有文档,但数组元素之一等于 Interactive 3D 的文档除外(不区分大小写) )
使用这样的查询:
db.clients.find({$text:{$search: '-interactive 3d'}})
结果将是所有只有此客户端的文档
"client":["Microsoft","Washington","Data Analytics"],
"client":["Microsoft","Washington","Hardware Devices Research Group"],
并且还能够排除所有匹配多个元素的文档 eq:microsoft washington data analytics
结果将是所有只有此客户端的文档:
"client":["Microsoft","Washington","Hardware Devices Research Group"],
"client":["Dell","Washington","Interactive 3D", "Technologies Research Group (I3D)"],
"client":["MSI","Washington","Interactive 3D", "Media Research Group"],
但我没有得到任何结果...
我使用这个取得了一些成功:
const nin = searchValue.split(' ');
db.clients.find({"client":{"$nin": nin} })
但它不区分大小写
【问题讨论】:
-
查看编辑,我添加了一个真实示例
标签: node.js mongodb full-text-search