mongodb查询以仅从文本索引中排除

时间:2019-08-16 16:23:26

标签: node.js mongodb full-text-search

我在数组字段上有一个文本索引,这是字段的样子:

{"client":["Aaaa","Bbbb"]},
{"client":["Ccc","Dddd"]},
{"client":["Ccc","Dddd"]},
{"client":["Aaaa","Bbbb"]},
{"client":["Ccc","Dddd"]},
{"client":["Aaaa","Bbbb"]},
{"client":["Ccc","Dddd"]},

我只需要通过搜索要排除的值而不是添加要包括的内容DdddAaaa来获取所有没有-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} }) 

但这并不区分大小写

2 个答案:

答案 0 :(得分:1)

有了简单的字符串数组,您可以简单地执行以下操作:

db.clients.find({client: {$ne: 'Dddd'}}).then(result => {
//do something with result
...
})
.catch(err => {
//do something with err
...
});

要查找具有多个键并进行不区分大小写的查询,您可以执行以下操作:

db.clients.find({client: {$nin: [/^Dddd$/i, /^Eeee$/i]}}).then(result => {
//do something with result
...
})
.catch(err => {
//do something with err
...
});

希望这会有所帮助:)

答案 1 :(得分:0)

我最终将$nin与正则表达式一起使用,不知道有可能,但是感谢这篇文章  Case Insensitive search with $in我设法解决了。

const v = searchValue.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const nin = v.split(' ');
var searchRegexp = [];
nin.forEach(function(s) {
  if (s) searchRegexp.push(new RegExp(s, 'i'));
});
db.clients.find({"client":{"$nin": searchRegexp} }) 

这样,我也可以进行部分搜索。 我只希望它不太慢(还没有测试)...如果有人有更好的解决方案,请告诉我。

谢谢