Node.js 如何在MongoDB中找到类似的文档?
我的食物数据库清单类似于:Node.js 如何在MongoDB中找到类似的文档?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我的食物数据库清单类似于: { Name: "burger", ingredients: [ {Item:"bread"}, {Item:"cheese"}, {Item:"tomato"} ] } 我如何才能在成分中找到最相似项目的文档?如果您将成分存储在文本字段中,则最好是: {配料:“面包奶酪西红柿”}然后你必须使用and查询相似性数据库。你的集合。查找({$text:{:{“西红柿”},{score:{$meta:{$textScor
{
Name: "burger",
ingredients: [
{Item:"bread"},
{Item:"cheese"},
{Item:"tomato"}
]
}
我如何才能在
成分中找到最相似项目的文档?如果您将成分存储在文本字段中,则最好是:
{配料:“面包奶酪西红柿”}然后你必须使用and查询相似性数据库。你的集合。查找({$text:{:{“西红柿”},{score:{$meta:{$textScore”}})。排序({score:{$meta:{$textScore”})并获得最相关的文档。首先,你的数据应该按照以下方式重新建模:
{
name: "Burger",
ingredients: [
"bread",
"cheese",
"tomato",
"beef"
]
}
额外的“项”不会添加任何附加信息,也不会以任何方式帮助访问数据
接下来,您需要创建一个
text
索引可以包括值为字符串或字符串元素数组的任何字段
所以我们只需要做一个
db.collection.ensureIndex({"ingredients":"text"})
现在我们可以做一个:
这应该给你最相关的文件
但是,您也可以通过非文本搜索直接匹配:
db.collection.find({ingredients:"beef"})
或多种成分
db.collections.find({ ingredients: { $all: ["beef","bread"] } })
因此,对于通过用户输入进行搜索,您可以使用文本搜索,对于通过选定成分进行搜索,您可以使用非文本搜索。您可能是指类似的文档?是的,我是指文档。我认为为成分创建文本字段不是最佳选择。这会使成分的管理更加复杂,例如在聚合中(想想要聚合的所有成分的列表)或单个匹配,更不用说$push
。记住,您还可以对数组进行文本索引。有关详细信息,请参阅我的答案。
db.collections.find({ ingredients: { $all: ["beef","bread"] } })