Estoy tratando de buscar documentos en mongodb que incluyan una cadena de búsqueda específica ingresada por el usuario. La colección en la que estoy tratando de buscar se llama import_products y la estructura de mi documento mongodb se parece a la siguiente.
{ ┃ _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 ┃ },Lo que necesito es que, para una tienda específica, debo buscar en todos los documentos de esa tienda y dentro de la propiedad del título del campo productData, necesito buscar la cadena de consulta ingresada por el usuario. Por lo tanto, necesito usar $ y condición para buscar la tienda y la cadena de consulta coincidente dentro de la propiedad del título y luego debo devolver todos los documentos que coincidan con la condición.
Intenté seguir pero sigo obteniendo una matriz vacía.
const regex = RegExp("/.*" + searchQuery + ".*/"); response = await db .collection("imported_products") .find({ $and: [ { shop: shop }, { "productData.title": { $regex: regex, $options: "i" } }, ], }) .toArray();Por favor, guíame por el camino correcto. Estoy usando koa.js para el servidor y next.js para el lado del cliente.
No es necesario que ingrese $and , de forma predeterminada, se cumplen todas las condiciones. También escribiste mal someshop como shomeshop en el documento 2, esa podría ser una de las razones por las que obtienes una matriz vacía. Tampoco necesita usar .* en RegExp("/.*" + searchQuery + ".*/") ya que, de forma predeterminada, si el texto coincide con cualquier parte de la entrada, la expresión regular devolverá verdadero y capturará la primera coincidencia. . Pasar una expresión regular con el operador $regex tampoco es necesario. Mi consejo es usar searchQuery.replace(/\s+/g, ' ') en su lugar. El siguiente ejemplo debería funcionar.
db.collection("imported_products").find({ shop: shop, "productData.title": { $regex: searchQuery, $options: "i" } })Puede probar la consulta aquí.