如何从包含嵌套数据的mongodb集合中查找多个实例
我有以下格式的数据:如何从包含嵌套数据的mongodb集合中查找多个实例,mongodb,python-3.x,mapreduce,aggregation-framework,Mongodb,Python 3.x,Mapreduce,Aggregation Framework,我有以下格式的数据: {'user': 'A', 'books' :['One', 'Two','Three','Seven']} {'user': 'B', 'books' :['Two', 'Four','Five']} {'user': 'C', 'books' :['Five', 'One','Two','Nine','Ten','Twelve']} {'user': 'D', 'books' :['One', 'Two','Six']} 用户共同拥有的书籍意味着某种形式的协作 在他们
{'user': 'A', 'books' :['One', 'Two','Three','Seven']}
{'user': 'B', 'books' :['Two', 'Four','Five']}
{'user': 'C', 'books' :['Five', 'One','Two','Nine','Ten','Twelve']}
{'user': 'D', 'books' :['One', 'Two','Six']}
用户共同拥有的书籍意味着某种形式的协作
在他们之间。我的目标是找出有多少书正在合作
关于(或者用户如何以某种形式进行协作)与
(未以任何形式合作的)
在这一点上,我确定我不能设计一个查询来显示这些信息,所以我想知道,这是mongdb的mapreduce可以做到的吗?如果是这样,怎么办
我以前没有做过任何mapreduce,但是看一下mongodb文档上的示例,似乎有可能用mongodb实现这一点。可以使用
这个查询统计藏书中多次出现的图书数量,如果我理解正确,这就是您要查找的图书
这看起来像是分组问题 虽然它可以通过mapreduce解决,但也可以通过使用聚合框架轻松解决: 我建议如下(如果你愿意,我可以“翻译”成pymongo):
它通过$unwind创建用户书籍对,计算每本书的使用数量,然后按降序对它们进行排序。这看起来像是一个分组问题 虽然它可以通过mapreduce解决,但也可以通过使用聚合框架轻松解决: 我建议如下(如果你愿意,我可以“翻译”成pymongo): 它通过$unwind创建用户书籍对,计算每本书的使用数量,然后按降序对它们进行排序。始终首选地图还原。速度快得多。 你的两个问题有点不同,首先是合作的书籍:
db.books.aggregate([
{$unwind : "$books"},
{$group: { _id:"$books", count: {$sum: 1}}},
{$match: {count: {$gt: 1}}},
{$sort: {count: -1}}
])
{
"result" : [
{
"_id" : "Two",
"count" : 4
},
{
"_id" : "One",
"count" : 3
},
{
"_id" : "Five",
"count" : 2
}
],
"ok" : 1
}
展示不止一次使用过的书籍
用户与其他人在书籍方面的合作更具参与性:
db.books.aggregate([
{$unwind : "$books"},
{$group: { _id:"$books", users: {$push: "$user"},count: {$sum: 1 }}},
{$match:{count: {$gt: 1}}},
{$unwind: "$users"},
{$group: {_id: "$users", count: {$sum: 1}}},
{$sort: {count: -1}}
])
{
"result" : [
{
"_id" : "C",
"count" : 3
},
{
"_id" : "A",
"count" : 2
},
{
"_id" : "D",
"count" : 2
},
{
"_id" : "B",
"count" : 2
}
],
"ok" : 1
}
因此,这给了我们每个用户协作的图书数量。
您可以更多地使用这些,交替排序和使用$project在键上获得更好的名称,但我认为这提供了一些如何使用聚合框架解决此类问题的概念。始终更喜欢over map reduce。速度快得多。
你的两个问题有点不同,首先是合作的书籍:
db.books.aggregate([
{$unwind : "$books"},
{$group: { _id:"$books", count: {$sum: 1}}},
{$match: {count: {$gt: 1}}},
{$sort: {count: -1}}
])
{
"result" : [
{
"_id" : "Two",
"count" : 4
},
{
"_id" : "One",
"count" : 3
},
{
"_id" : "Five",
"count" : 2
}
],
"ok" : 1
}
展示不止一次使用过的书籍
用户与其他人在书籍方面的合作更具参与性:
db.books.aggregate([
{$unwind : "$books"},
{$group: { _id:"$books", users: {$push: "$user"},count: {$sum: 1 }}},
{$match:{count: {$gt: 1}}},
{$unwind: "$users"},
{$group: {_id: "$users", count: {$sum: 1}}},
{$sort: {count: -1}}
])
{
"result" : [
{
"_id" : "C",
"count" : 3
},
{
"_id" : "A",
"count" : 2
},
{
"_id" : "D",
"count" : 2
},
{
"_id" : "B",
"count" : 2
}
],
"ok" : 1
}
因此,这给了我们每个用户协作的图书数量。
您可以更多地使用这些,交替排序和使用$project在键上获得更好的名称,但我认为这提供了一些如何使用聚合框架解决此类问题的概念