Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从包含嵌套数据的mongodb集合中查找多个实例_Mongodb_Python 3.x_Mapreduce_Aggregation Framework - Fatal编程技术网

如何从包含嵌套数据的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}}
    ])
    
  • “展开”为每个用户和“书本中的书本”创建一个文档
  • 对书籍进行分组,我们计算协作用户总数
  • 过滤掉计数不超过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}}
    ])
    
  • 像以前一样展开书本阵列
  • 再次对书籍进行分组,但这次我们将处理这些书籍的用户推到一个数组中
  • 过滤掉计数不超过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}}
    ])
    
  • “展开”为每个用户和“书本中的书本”创建一个文档
  • 对书籍进行分组,我们计算协作用户总数
  • 过滤掉计数不超过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}}
    ])
    
  • 像以前一样展开书本阵列
  • 再次对书籍进行分组,但这次我们将处理这些书籍的用户推到一个数组中
  • 过滤掉计数不超过1的任何内容。没有合作者
  • 展开用户数组,这样我们就可以为一个用户提供多个图书文档
  • 对用户进行分组并总结书籍
  • 按相反顺序排序只是为了好玩
  • 其结果是:

    {
        "result" : [
                {
                        "_id" : "C",
                        "count" : 3
                },
                {
                        "_id" : "A",
                        "count" : 2
                },
                {
                        "_id" : "D",
                        "count" : 2
                },
                {
                        "_id" : "B",
                        "count" : 2
                }
        ],
        "ok" : 1
    }
    
    因此,这给了我们每个用户协作的图书数量。 您可以更多地使用这些,交替排序和使用$project在键上获得更好的名称,但我认为这提供了一些如何使用聚合框架解决此类问题的概念