如何在 MongoDB 中的嵌套文档中索引未知数量的字段?



我有一个嵌入式文档,我想对它执行文本搜索。

{
"_id" : ObjectId("5dd98c50f4351257b16ea7ff"),
"author" : "Author",
"apiid" : "235445623",
"title" : "Test Document One",
"url" : "test_document_one",
"tags" : [
"first",
"post",
"article",
"sports"
],
"content" : {
"paragraph1" : "This is the first paragraph of this article but I changed it. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.",
"picture1" : "https://natureconservancy-h.assetsadobe.com/is/image/content/dam/tnc/nature/en/photos/Brown_County_Hills_Leonetti.jpg?crop=33,0,1192,656&wid=4000&hei=2200&scl=0.29818181818181816",
"paragraph2" : "This is the second paragraph of this article. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
},
"date" : ISODate("2019-11-24T11:12:31.890Z")
}

我的问题是我不知道会有多少段落,我仍然需要单独访问每个段落的可能性。因此,如果我这样做:

db.article.createIndex({ "content.$**": 1 })

我想做这样的事情:

db.article.find({"content.paragraph*": {"programming"}})

* 将对所有段落字段执行正则表达式,以便查找查询将在所有可用段落上运行。

结果应该是在任何段落中都有"编程"一词的所有文档。

我可以通过查询所有段落在我的后端做到这一点,然后为每个段落做一个 for 循环,但我认为 Mongo 内部会有一个解决方案。

我愿意接受任何建议或提示, 谢谢,祝你有美好的一天!

将内容数据组织为数组中的一组子文档是解决此问题的一种方法。每个子文档都有"para"和"pic"等字段。 要访问文章内容中的para,请使用数组中的索引位置;例如,第一个段落位于0指数等。content字段将如下所示:

content: [ { para: "para1's text...", pic: "pic-1's url" }, { para: "...", pic: "..." }, ... ]


创建文本索引和查询:

content.para字段上创建文本索引

db.articles.createIndex( { "content.para" : "text" } )

查询以查找文档中任何段落中的文本,例如:

db.articles.find( { $text: { $search: "javascript" } } )

一种有效的查询方法是限制搜索文本的文档数量,例如:

db.articles.find( { author: "phibiz", $text: { $search: "programming" } } )

-或-

db.articles.find( { date: { $gte: ISODate("2019-11-20"), $text: { $search: "programming" } } )


笔记:

  • 文本索引
  • 存储和性能 成本

最新更新