我有以下结构。
书籍收藏:
{
_id: "book_1",
title: "How to build a house",
authorId: "author_1"
}
{
_id: "book_2",
title: "How to plant a tree",
authorId: "author_2"
}
作者收藏:
{
_id: "author_1",
name: "Adam Adamson"
}
{
_id: "author_2",
name: "Brent Brentson"
}
我想用字符串" b"进行不区分大小写的自由文本搜索。通过书籍收藏,找到所有有" b"在标题中或有一个作者与" b"在名称中。
我可以将作者嵌入book对象中,以便能够进行查询。但是,如果作者名称在authors集合中发生更改,则嵌入的authors对象将具有错误的名称。
{
_id: "book_2",
title: "How to plant a tree",
authorId: "author_2",
author:
{
name: "Brent Brentson"
}
}
解决这个问题的好方法是什么?
答案 0 :(得分:3)
您可以使用以下查询,其中第一个获取与authors集合上给定的 regex 表达式查询匹配的作者ID数组(使用 {{3} map()
游标的方法,第二个查询使用 find()
运算符将该数组应用于图书集合查询中以及使用 $in
查找标题中包含"b"
的图书:
var authorIds = db.authors.find({"name": /b/i}).map(function (doc) {return doc._id});
db.books.find({$or: [{"title": /b/i}, {"authorId": {"$in": authorIds} }]})
<强>结果强>:
/* 0 */
{
"_id" : "book_1",
"title" : "How to build a house",
"authorId" : "author_1"
}
/* 1 */
{
"_id" : "book_2",
"title" : "How to plant a tree",
"authorId" : "author_2"
}
- 更新 -
感谢@yogesh建议使用 regex pattern 方法获取作者ID列表的另一种方法:
var authorIds = db.authors.distinct("_id", {"name": /b/i})