在mongodb集合中查找不区分变音符号的

wfypjpf4  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(91)

我在nodejs中有这样的代码,它接收一个单词。:

exports.findProductsByWords = async (req, res) => {
  let searchWords = req.body.searchWord; // Replace with your array of words
  console.log("searchWords", searchWords);

  try {
    const producto = await Producto.find({
      title: { $regex: searchWords, $options: "i" },
    }).collation({ locale: "es", strength: 2 });
    /* .populate({
        path: "author",
        select: "nombre direccion telefono email imagesAvatar",
      }); */
    console.log("el producto :" + producto);
    res.status(200).json({ prodAll: producto });
  } catch (error) {
    console.log(error);
    res.status(500).send("Hubo un Error");
  }
};

我想从我的收藏收到Producto,所有的产品,有一个词'arnés',虽然我写在我的搜索字段'arnés'或'arnes'.
我确实认为我用整理达到了,但没有作品。在我的数据库中,这个词总是白色的arnés,但也许用户会输入“阿内斯”,我想工作。
一些想法?我用 Mongoose :在我的nodejs后端7.5.0。
谢谢

92dk7w1h

92dk7w1h1#

一种选择是设置$text搜索索引。使用mongosh登录到您的数据库或使用compass连接并运行:

db.products.createIndex({title: "text"}, {default_language:"spanish"}); 
// I assume your collection is called products

这将允许您对每个producttitle属性进行文本搜索,并且传递的值是'arnés'还是'阿内斯'都无关紧要,因为默认情况下,$diacriticSensitive布尔选项设置为false。
$diacriticSensitive布尔值。可选。一个布尔标志,用于启用或禁用对版本3文本索引的区分变音符号的搜索。假的,假的;即搜索服从文本索引的变音符号不敏感性。
现在你可以像这样运行Model.find()

const producto = await Producto.find({
   $text: {
      $search: "arnes Monica léo"
   }
});

// Returns
[
   {_id: new ObjectId("64ff81dd507561a33ce92771"), title: 'Arnes'},
   {_id: new ObjectId("64ff81dd507561a33ce92772"), title: 'arnes'},
   {_id: new ObjectId("64ff81dd507561a33ce92773"), title: 'Arnés'},
   {_id: new ObjectId("64ff81dd507561a33ce92774"), title: 'arnés'},
   {_id: new ObjectId("64ff81dd507561a33ce92775"), title: 'Leo'},
   {_id: new ObjectId("64ff81dd507561a33ce92776"), title: 'leo'},
   {_id: new ObjectId("64ff81dd507561a33ce92777"), title: 'Léo'},
   {_id: new ObjectId("64ff81dd507561a33ce92778"), title: 'léo'},
   {_id: new ObjectId("64ff81dd507561a33ce92779"), title: 'Monica'},
   {_id: new ObjectId("64ff81dd507561a33ce92780"), title: 'monica'},
   {_id: new ObjectId("64ff81dd507561a33ce92781"), title: 'Mónica'},
   {_id: new ObjectId("64ff81dd507561a33ce92782"), title: 'mónica'}
]

如果你想让查询区分大小写,那么你需要传入$caseSensitive选项,并将其设置为true,如下所示:

const producto = await Producto.find({
   $text: {
      $search: "arnes Monica léo",
      $caseSensitive: true
   }
});

相关问题