我有一个嵌入式文档,我想对其进行文本搜索。
{
"_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"}})
和*将对所有段落字段进行正则表达式,以便find查询将在所有可用段落上运行。
结果应该是任何段落中所有带有“ programming”一词的文档。
我可以在后端通过查询所有段落来执行此操作,然后为每个段落执行一个for循环,但是我认为Mongo内部将提供解决方案。
我愿意接受任何建议或提示, 谢谢,祝你有美好的一天!
答案 0 :(得分:0)
将内容数据组织为数组中的一组子文档是解决此问题的一种方法。每个子文档都具有“ 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" } } )
注释: