mongodb:计算唯一数组元素
mongodb: counting unique array elements
我正在尝试获取整个集合中数组元素的总数。
输入集合是
db.test.insert( { "_id" : 1, "item" : "A", "hx" : [ { "label" : "new" , "price" : 10.99 , "category" : "P1"} ,
{ "label" : "active" , "price" : 12.99 , "category" : "P2"} ] } )
db.test.insert( { "_id" : 2, "item" : "B", "hx" : [ { "label" : "new" , "price" : 10.99 , "category" : "P2"} ,
{ "label" : "active" , "price" : 8.99 , "category" : "P3"} ] } )
db.test.insert( { "_id" : 3, "item" : "C", "hx" : [ { "label" : "new" , "price" : 10.99 , "category" : "P1"} ,
{ "label" : "active" , "price" : 15.99 , "category" : "P4"} ] } )
我试过
的变体
a = db.test.aggregate(
[ {
$group: {
_id : "$cat",
cat : { $addToSet : "$hx.category" }
}
},
{ $unwind : "$hx.category" } ,
{ $group : { _id : "$cat", count: { $sum : 1 } } }
])
去
db.res.insert({ "category" : "P1" , "count" : 2 })
db.res.insert({ "category" : "P2" , "count" : 2 })
db.res.insert({ "category" : "P3" , "count" : 1 })
db.res.insert({ "category" : "P4" , "count" : 1 })
但我得到的结果是
> a
{ "result" : [ ], "ok" : 1 }
最终我想 运行 在 pymongo 中这样做:非常感谢任何关于 pymongo 实现的提示。
看起来像是 Map-Reduce
的任务
我假设您的类别字段是一组具有唯一条目的集合。
db.test.aggregate([
{$unwind: "$hx"},
{$group: {_id: "$hx.category", count:{$sum:1}}}
])
您可以尝试以下聚合:
>>> from bson.son import SON
>>> pipeline = [
... {"$unwind": "$hx"},
... {"$group": {"_id": "$hx.category", "count": {"$sum": 1}}},
... {"$project": SON([("count", -1), ("_id", -1)])}
... ]
>>> list(db.test.aggregate(pipeline))
[{u'count': 1, u'_id': u'P3'}, {u'count': 2, u'_id': u'P2'}, {u'count': 1, u'_id': u'P4'}, {u'count': 2, u'_id': u'P1'}]
我正在尝试获取整个集合中数组元素的总数。
输入集合是
db.test.insert( { "_id" : 1, "item" : "A", "hx" : [ { "label" : "new" , "price" : 10.99 , "category" : "P1"} ,
{ "label" : "active" , "price" : 12.99 , "category" : "P2"} ] } )
db.test.insert( { "_id" : 2, "item" : "B", "hx" : [ { "label" : "new" , "price" : 10.99 , "category" : "P2"} ,
{ "label" : "active" , "price" : 8.99 , "category" : "P3"} ] } )
db.test.insert( { "_id" : 3, "item" : "C", "hx" : [ { "label" : "new" , "price" : 10.99 , "category" : "P1"} ,
{ "label" : "active" , "price" : 15.99 , "category" : "P4"} ] } )
我试过
的变体 a = db.test.aggregate(
[ {
$group: {
_id : "$cat",
cat : { $addToSet : "$hx.category" }
}
},
{ $unwind : "$hx.category" } ,
{ $group : { _id : "$cat", count: { $sum : 1 } } }
])
去
db.res.insert({ "category" : "P1" , "count" : 2 })
db.res.insert({ "category" : "P2" , "count" : 2 })
db.res.insert({ "category" : "P3" , "count" : 1 })
db.res.insert({ "category" : "P4" , "count" : 1 })
但我得到的结果是
> a
{ "result" : [ ], "ok" : 1 }
最终我想 运行 在 pymongo 中这样做:非常感谢任何关于 pymongo 实现的提示。
看起来像是 Map-Reduce
的任务我假设您的类别字段是一组具有唯一条目的集合。
db.test.aggregate([
{$unwind: "$hx"},
{$group: {_id: "$hx.category", count:{$sum:1}}}
])
您可以尝试以下聚合:
>>> from bson.son import SON
>>> pipeline = [
... {"$unwind": "$hx"},
... {"$group": {"_id": "$hx.category", "count": {"$sum": 1}}},
... {"$project": SON([("count", -1), ("_id", -1)])}
... ]
>>> list(db.test.aggregate(pipeline))
[{u'count': 1, u'_id': u'P3'}, {u'count': 2, u'_id': u'P2'}, {u'count': 1, u'_id': u'P4'}, {u'count': 2, u'_id': u'P1'}]