我有一个包含以下文档的集合:
{
"_id" : ObjectId("5ad609a2ac1a8b644180936a"),
"content" : "Coffee and cakes..."
},
{
"_id" : ObjectId("5ad609baac1a8b644180936b"),
"content" : "coffee shop..."
}
文本搜索查询的结果:
find({ $text: { $search: "\"coffee shop\" cakes" } })
只返回第二个文档,但我期待两个文档。问题是什么?
答案 0 :(得分:2)
这......
detach()
...将搜索具有find({ $text: { $search: "coffee shop cakes" } })
属性的任何文档,其中包含" coffee"或" shop"或"蛋糕"
但是这......
content
...将搜索具有find({ $text: { $search: "\"coffee shop\" cakes" } })
属性的任何文档,其中包含短语"咖啡店"。
我认为当您提交短语("咖啡店")和一个额外的搜索值时,您会期待上述两种行为(" cake" )。但是,这不是MongoDB如何处理短语和附加术语的组合。
来自the docs:
如果
content
字符串包含短语和单个字词,则文本搜索仅匹配包含该短语的文档。
根据these docs,查询$search
将被评估为:
"\"coffee shop\" cakes"
这只与第二个文档正确匹配。
注意:text index docs与此相矛盾,根据这些文档,查询"coffee shop" AND ("cakes" or "coffee" or "shop")
将被评估为:"\"coffee shop\" cakes"
,但您观察到的行为与"coffee shop" OR "cakes"
一致上面引用的运营商文档。
感谢raising this issue with MongoDB的@RahulRaj,他们的回复确认文档不正确:
正如您所正确指出的那样,这两个页面之间的文档存在不一致。我们正在跟踪DOCS-10382中的文档。
https://docs.mongodb.com/manual/reference/operator/query/text/#phrases正确描述了此功能的当前实现。
答案 1 :(得分:0)
db.collectionName.find({content:{$ regex:/ ^ coffee / i}});
/我将忽略案例
帮助链接:https://docs.mongodb.com/manual/reference/operator/query/regex/#examples