我的 MongoDb 有大约 5 亿个文档,如下所示:
{
"_id": objectId,
"Name": "John Smith",
"Address": "132, My Street, Kingston, New York 12401"
}
现在我想根据名称正则表达式和地址正则表达式查询数据,因为有时名称在我的数据库中区分大小写,有时地址也区分大小写。我尝试为两个字段创建单独的索引(1),还尝试使用文本创建复合索引(在文本索引中,问题是它仅搜索文本索引是否在一个字段上,地址或名称不适用于两个字段的索引带文字)。
还尝试了两个字段索引:createIndex({Name: 1, Address: 1}); <--- this returns data also if i search with one field only. I want to perform a query like:
var name = "john smith";
var address = "new york";
var userData = await db
.collection("userData")
.find({
$and: [
{ Name: { $regex: new RegExp(name, "i") } },
{ Address: { $regex: new RegExp(address, "i") } },
],
})
.skip(skip)
.limit(limitNumber)
.toArray();
如果我尝试使用单个索引,我仍然可以使用一个字段而不是两个字段执行查询。我使用上述所有方法尝试了这两个字段,即使我尝试延长查询毫秒时间,仍然需要永远加载,但仍然不会返回任何内容,甚至不会返回错误。
谢谢
试试这个:
var userData = await db
.collection("userData")
.find({
Name: { $regex: new RegExp(name, "i") },
Address: { $regex: new RegExp(address, "i") }
})
$and
不需要操作员。
如果你喜欢用它,那么你一定要和
$expr
一起使用
var userData = await db
.collection("userData")
.find({ $expr: {
$and: [
{ $regexMatch: { input: "$Name", regex: name, options: "i" } },
{ $regexMatch: { input: "$Address", regex: address, options: "i" } }
],
}})