使用and条件在mongodb文档的嵌套对象中搜索特定字符串

Posted

技术标签:

【中文标题】使用and条件在mongodb文档的嵌套对象中搜索特定字符串【英文标题】:Search for specific string in a nested object in mongodb documents using and condition 【发布时间】:2022-01-19 15:12:01 【问题描述】:

我正在尝试在 mongodb 中搜索包含用户输入的特定搜索字符串的文档。我试图搜索的集合名为imported_products,我的mongodb文档结构如下所示。

 
┃     _id: 61add3b16c9e0008e6ad325b,
┃     shop: 'someshop',
┃     shopUserData:  name: 'LoTesting', email: 'vixen@yahoo.com' ,
┃     productData: 
┃       title: 'Eyglo 3-in-1 Head Strap for Oculus Quest 2 with Face Silicone Cover & Controllers Grips Covers',
┃       price: 45.99,
┃       priceWithCurrency: '$45.99',
┃       images: [Array],
┃       ASIN: 'B08TWJJ3ZW',
┃       marketPlace: 'www.amazon.com',
┃       settings: [Object],
┃       shopifyProductId: 87187377131097
┃     ,
┃     created_at: 2021-12-06T09:11:13.327Z
┃   ,
┃   
┃     _id: 61ae236cac749b088d427497,
┃     shop: 'shomeshop',
┃     shopUserData:  name: 'LoTesting', email: 'test@gmail.com' ,
┃     productData: 
┃       title: 'Xbox Series X',
┃       description: 'Amazon Prime customers will have priority access to the Xbox Series X until November 24, 2021.',
┃       price: 'price not available',
┃       priceWithCurrency: 'price not available',
┃       images: [Array],
┃       ASIN: 'B08H75RTZ8',
┃       marketPlace: 'www.amazon.com',
┃       settings: [Object],
┃       shopifyProductId: 5736818278172
┃     ,
┃     created_at: 2021-12-06T14:51:24.755Z
┃   ,

我需要的是,对于特定的商店,我需要查看该商店的所有文档以及 productData 字段的标题属性内,我需要搜索用户输入的查询字符串。所以,我需要使用 $and 条件在 title 属性中查找 shop 和匹配的查询字符串,然后我需要返回所有匹配条件的文档。

我尝试了以下但我不断得到空数组。

const regex = RegExp("/.*" + searchQuery + ".*/");
response = await db
  .collection("imported_products")
  .find(
    $and: [
       shop: shop ,
       "productData.title":  $regex: regex, $options: "i"  ,
    ],
  )
  .toArray();

请引导我走向正确的道路。我将 koa.js 用于服务器,将 next.js 用于客户端。

【问题讨论】:

【参考方案1】:

您不需要手动输入$and,因为默认情况下所有条件都匹配。此外,您在文档 2 中将 someshop 拼错为 shomeshop,这可能是获得空数组的原因之一。您也不需要在RegExp("/.*" + searchQuery + ".*/") 中使用.*,因为默认情况下,如果文本匹配输入的任何部分,正则表达式将返回true 并捕获第一个匹配项。也不需要使用运算符 $regex 传递正则表达式。我的建议是改用searchQuery.replace(/\s+/g, ' ')。下面的例子应该可以工作。

db.collection("imported_products").find(
  shop: shop,
  "productData.title": 
    $regex: searchQuery,
    $options: "i"
  
)

可以测试查询here.

【讨论】:

以上是关于使用and条件在mongodb文档的嵌套对象中搜索特定字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用具有嵌套或条件的多个 where(或 AND)?

在 MongoDB 中使用 group by、inner join 和嵌套条件进行聚合

将查询构建器条件转换为 MongoDB 操作,包括嵌套的子文档数组

在 MongoDB 中聚合双嵌套数组的文档

通过 mongoose 为 mongodb 中集合的文档中的每个嵌套对象创建 ID

将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)