有一个指向作者列表的书籍列表,我想要显示一个树,在每个节点中都有作者姓名和他写的书数。最初,我已将 authors [] 数组直接嵌入到 books 集合中,这就像一个魅力,使用聚合框架的魔力。然而,稍后,我意识到每个作者附加一些附加信息会很好(例如它的图片,传记数据,出生日期等)。对于第一个解决方案,这很糟糕,因为:
接下来要使用名为 authors 的第二个集合,每个图书文档都引用了一个作者ID列表,如下所示:
{
"_id" : ObjectId("58ed2a254374473fced950c1"),
"authors" : [
"58ed2a254d74s73fced950c1",
"58ed2a234374473fce3950c1"
],
"title" : "Book title"
....
}
为了获得作者的详细信息,我有两个选择:
问题:
您对实施此行为的建议是什么? (我正在使用Spring Data)
答案 0 :(得分:2)
您可以在spring mongo应用程序中尝试以下查询。
UnwindOperation unwindAuthorIds = Aggregation.unwind("authorsIds", true);
LookupOperation lookupAuthor = Aggregation.lookup("authors_collection", "authorsIds", "_id", "ref");
UnwindOperation unwindRefs = Aggregation.unwind("ref", true);
GroupOperation groupByAuthor = Aggregation.group("ref.authorName").count().as("count");
Aggregation aggregation = Aggregation.newAggregation(unwindAuthorIds, lookupAuthor, unwindRefs, groupByAuthor);
List<BasicDBObject> results = mongoOperations.aggregate(aggregation, "book_collection", BasicDBObject.class).getMappedResults();
答案 1 :(得分:1)
按照@ Veeram的建议,我能够写下这个查询:
db.book_collection.aggregate([
{
$unwind: "$authorsIds"
},
{
$lookup: {
from: "authors_collection",
localField: "authorsIds",
foreignField: "_id",
as: "ref"
}
},
{$group: {_id: "$ref.authorName", count: {$sum: 1}}}
])
返回如下内容:
{
"_id" : [
"Paulo Coelho"
],
"count" : 1
}
/* 2 */
{
"_id" : [
"Jules Verne"
],
"count" : 2
}
这正是我所需要的,听起来是正确的。我现在只需要做一个额外的查询来获取没有作者设置的书籍。