【问题标题】:search mongoDB by 2 fields通过 2 个字段搜索 mongoDB
【发布时间】:2019-01-17 21:28:31
【问题描述】:

我一直在查看有关堆栈溢出的其他一些答案,并尽我所能。我了解到我需要创建一个文本索引来定义我的架构,我这样做了:

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 } }  ] } )

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

    【讨论】:

    • 感谢您的链接。我通常检查 Mongoose 文档,但我发现 mongo db 文档要好得多。很难在 Mongoose 文档中找到东西,反正我觉得很难。我试图保持一致并使用 mongoose 语法,因为它与 mongo 不同
    • 好吧,我给了你一个例子,说明你如何使用你的相关问题
    • 不应该是 AND 而不是 OR,因为这两个条件都需要满足
    • 如果两个条件都满足,那么是 AND ,我会编辑我的帖子
    • 谢谢。我现在正在测试它,但遇到一个错误,我也会尝试调试。未知的顶级运算符:$search
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2020-06-16
    • 2012-08-30
    • 2017-06-26
    • 2020-01-22
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多