如何在MongoDB中找到类似的文档?

时间:2015-04-13 23:35:25

标签: node.js mongodb mongoose

我的食物数据库列表类似于:

 {
   Name: "burger",
   ingredients: [
     {Item:"bread"},
     {Item:"cheese"},
     {Item:"tomato"}
   ]
 }

如何找到ingredients中具有最相似项目的文档?

2 个答案:

答案 0 :(得分:8)

首先,您的数据应按以下方式进行重新设计:

{
  name: "Burger",
  ingredients: [
    "bread",
    "cheese",
    "tomato",
    "beef"
  ]
}

额外"项目"不会添加任何其他信息,也不会以任何方式帮助访问数据。

接下来,您需要创建一个text index。文档说明了

  

text索引可以包含任何字段,其值为字符串或字符串元素数组。

所以我们只是做一个

db.collection.ensureIndex({"ingredients":"text"})

现在我们可以进行$text search

db.collection.find(
  { $text: { $search: "bread beef" } },
  { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

应该为您提供最相关的文件。

但是,你还可以做的是直接匹配的非文本搜索:

db.collection.find({ingredients:"beef"})

或多种成分

db.collections.find({ ingredients: { $all: ["beef","bread"] } })

因此,对于按用户输入搜索,您可以使用文本搜索和按所选成分搜索,您可以使用非文本搜索。

答案 1 :(得分:-2)

如果您将成分存储在文本字段中,那么最好的机会是: {ingredients:“bread cheese tomato”}然后你必须使用text index并查询相似性db.your_collection.find({$ text:{$search:{“tomato”}},{score :{$ meta:“textScore”}})。sort({score:{$ meta:“textScore”}})并获取最相关的文档