我在数组字段上有一个文本索引,这是字段的样子:
{"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} })
但这并不区分大小写
答案 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} })
这样,我也可以进行部分搜索。 我只希望它不太慢(还没有测试)...如果有人有更好的解决方案,请告诉我。
谢谢