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