Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Python 当从文档数组返回一个字段的数组时,如何让MongoDB返回数字数组而不是字典项数组?_Python_Mongodb_Pandas - Fatal编程技术网

Python 当从文档数组返回一个字段的数组时,如何让MongoDB返回数字数组而不是字典项数组?

Python 当从文档数组返回一个字段的数组时,如何让MongoDB返回数字数组而不是字典项数组?,python,mongodb,pandas,Python,Mongodb,Pandas,我的收藏中的每个文档都有一个文档数组,该数组中的每个文档都包含一个名为“sport”的字段。我只想返回一个数组,其中包含数组中每个成员的sport值。现在,当我执行这个命令时,我得到了一个字典数组 c = db.users.aggregate([{'$project':{"id_nm":True, "activityArray.sport":True, "lengthArray":{'$size':"$activityArray"}}}]) 具体而言,这是输出:

我的收藏中的每个文档都有一个文档数组,该数组中的每个文档都包含一个名为“sport”的字段。我只想返回一个数组,其中包含数组中每个成员的sport值。现在,当我执行这个命令时,我得到了一个字典数组

c = db.users.aggregate([{'$project':{"id_nm":True, "activityArray.sport":True, "lengthArray":{'$size':"$activityArray"}}}])
具体而言,这是输出:

                                      activityArray      id_num  lengthArray
0  [{u'sport': 24}, {u'sport': 18}, {u'sport': 24...  21692            4
1  [{u'sport': 2}, {u'sport': 2}, {u'sport': 2}, ...  17990           10
2  [{u'sport': 0}, {u'sport': 0}, {u'sport': 0}, ...  21929            4
3                     [{u'sport': 0}, {u'sport': 0}]  21441            2
4                   [{u'sport': 18}, {u'sport': 18}]  20251            2

有没有办法只返回一个数字数组,这样我就不必在将这些行放入数据帧后解析它们?

您可以通过以下方式获得所需的输出:

 db.users.aggregate([{$unwind: "$activityArray"},{$group: {_id: "$id_nm", activities: {$push: "$activityArray.sport"}}}, {$project: {"_id": 1, "activities":1, "lengthArray": {'$size': "$activities"}}}]);
或者更好:

db.users.aggregate([{$group: {_id: "$id_nm", activities: {$addToSet: "$activityArray.sport"}, count: {$sum: {$size: "$activityArray"}}}}]);

您可以通过以下方式获得所需的输出:

 db.users.aggregate([{$unwind: "$activityArray"},{$group: {_id: "$id_nm", activities: {$push: "$activityArray.sport"}}}, {$project: {"_id": 1, "activities":1, "lengthArray": {'$size': "$activities"}}}]);
或者更好:

db.users.aggregate([{$group: {_id: "$id_nm", activities: {$addToSet: "$activityArray.sport"}, count: {$sum: {$size: "$activityArray"}}}}]);

感谢您的建议,但是我想为每个用户维护单独的数组,我还想维护一个数字在数组中的频率计数,因此set在这里不起作用。上面提到的第一个用法(使用$push)应该可以帮助您实现这一点,就像在
db.users.aggregate中一样([{$group:{id:$id\$nm],activities:{$push:“$activityArray.sport”},计数:{$sum:{$size:$activityArray”}}]);
。您还需要其他东西吗?第一次使用会返回一个巨大的数组,而不是每个用户的不同数组。您是否尝试了我在上面的评论中发布的数组?请告诉我们这是您想要的还是其他东西。评论中的行给出了此错误:“errmsg”:异常:$size的参数必须是数组,但类型为:EOO“,我仍在努力解决这个问题。谢谢你的建议,但是我想为每个用户维护单独的数组,我还想维护一个数字在数组中的频率计数,所以set在这里不起作用。上面提到的第一个用法(使用$push)应该可以帮助你实现这一点,就像在
db.users.aggregate([{$group:{u id:$id:$u-nm],活动:{$push:“$activityArray.sport”},计数:{$sum:{$size:{$activityArray”}})。你还期待什么吗?第一次使用会为每个用户返回一个巨大的数组,而不是一个不同的数组。你尝试过我在上面的评论中发布的那个吗?让我们知道这是否是您正在寻找的,或者是否有什么不同。注释中的行给出了此错误:“errmsg”:“异常:$size的参数必须是数组,但类型为:EOO”,我仍在尝试解决此问题。谢谢你的建议,但是我想为每个用户维护单独的数组,我还想维护一个数字在数组中的频率计数,所以set在这里不起作用。上面提到的第一个用法(使用$push)应该可以帮助你实现这一点,就像在
db.users.aggregate([{$group:{u id:$id:$u-nm],活动:{$push:“$activityArray.sport”},计数:{$sum:{$size:{$activityArray”}})。你还期待什么吗?第一次使用会为每个用户返回一个巨大的数组,而不是一个不同的数组。你尝试过我在上面的评论中发布的那个吗?让我们知道这是否是您正在寻找的,或者是否有什么不同。注释中的行给出了此错误:“errmsg”:“异常:$size的参数必须是数组,但类型为:EOO”,我仍在尝试解决此问题。会让你知道它是否有效。