使用MongoDB

时间:2015-06-05 08:52:43

标签: mongodb mongodb-query

我有以下结构。

书籍收藏:

{
    _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"
    }
}

解决这个问题的好方法是什么?

1 个答案:

答案 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})