Mongodb 有 5 亿个文档,我想根据 javascript 驱动程序中的两个字段而不是模式使用正则表达式进行搜索

问题描述 投票:0回答:1

我的 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();

如果我尝试使用单个索引,我仍然可以使用一个字段而不是两个字段执行查询。我使用上述所有方法尝试了这两个字段,即使我尝试延长查询毫秒时间,仍然需要永远加载,但仍然不会返回任何内容,甚至不会返回错误。

enter image description here

谢谢

javascript mongodb mongodb-query mongodb-nodejs-driver
1个回答
0
投票

试试这个:

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" } }
    ],
  }})
© www.soinside.com 2019 - 2024. All rights reserved.