通过2个字段搜索mongoDB

时间:2019-01-17 12:51:23

标签: node.js mongodb mongoose

我一直在寻找有关堆栈溢出的其他答案,并尽我所能。我了解到需要创建一个文本索引,在其中定义我的模式,就像这样:

productSchema.index({'title': 'text', 'address.city': 'text'});

如果我仅按1个字段(即标题)进行搜索,那么我会得到预期的结果。

Product.find( { $text: { $search: searchTerm } } )

但是尝试按标题和城市一起搜索时,我的查询有问题。

 Product.find( { $text: { $search: searchTerm }, $text: { $search: city } } )

我没有看到错误,但是即使知道查询应该有结果,也没有结果。我不确定是否是因为地址是一个对象(根据我在Compass中看到的内容)

这就是我在使用Mongoose的模式中定义它的方式

address: {
    city: {type: String, required: true }
},

如果我这样做:

Product.find().and([{ title: searchTerm }, { 'address.city': city }])

几乎可以使用。但是我必须输入产品的确切名称。如果产品被称为“橡皮鸭”,而我键入“鸭子”,则没有任何结果。如果我输入“橡皮鸭”并选择城市,则会在返回的结果中列出。

我也尝试过这种方法:

Product.find( { $and: [ {$text: { $search: searchTerm }}, { address: {city : city } }  ] } )

这似乎可行,但可能需要改进!

1 个答案:

答案 0 :(得分:1)

您是否浏览了以下链接?
https://docs.mongodb.com/manual/reference/operator/query/or/
在那里,您可以找到如何在同一查询中添加多个表达式。 如果要搜索标题可能等于A或B的标题,请使用如下查询:db.inventory.find( { $or: [ { title: "A" }, { title: "B"} ] } )
编辑
如果您需要db中的数据来匹配查询中的两个表达式,请使用以下内容:
Product.find( { $and: [{ address:{city: "CityName"} }, { address: {country : "UK" } } ] } )