MongoDB 聚合内部 child collection 上的组并获取计数
MongoDB aggregate group on inner child collection and get count
我有一个用户 collection,它还有一个 'UserSubscription' collection,它还有一个 'Subscription > Publication'。
我在 Mongo
中关注了用户 collection
/* 1 */
{
"_id" : 1,
"UserSubscriptions" : [
{
"_id" : 1,
"Subscription" : {
"_id" : 1,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
},
{
"_id" : 2,
"Subscription" : {
"_id" : 2,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
},
},
{
"_id" : 7,
"Subscription" : {
"_id" : 7,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
}
]
}
/* 2 */
{
"_id" : 2,
"UserSubscriptions" : [
{
"_id" : 3,
"Subscription" : {
"_id" : 3,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 3 */
{
"_id" : 3,
"UserSubscriptions" : [
{
"_id" : 4,
"Subscription" : {
"_id" : 4,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 4 */
{
"_id" : 4,
"UserSubscriptions" : [
{
"_id" : 5,
"Subscription" : {
"_id" : 5,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
}
}
]
}
我正在尝试获取所有 'Publication code' 和计数(用户订阅订阅计数)。所以从上面 collection 我想要这样的结果
PublicationCode Count (Number of users)
1MM 3
2MM 2
我试过 MongoDB 查询但没有得到实际结果
db.runCommand(
{ aggregate : "User", pipeline : [
{$match: { "UserSubscriptions.0": {$exists: true}} },
{$group: {_id:"$UserSubscriptions.Subscription.Publication.Code", count:{$sum:1}}},
{$project: {_id:1,count:1 } }
]}
);
请指教一些在 child collection
上使用组的方法
(机器人 3T 1.2.1) (MongoDB.Driver 2.4.4)
对应的C#Mongo驱动查询为
var unWind = new BsonDocument
{
{ "$unwind", "$UserSubscriptions" }
};
var group = new BsonDocument
{{"$group",
new BsonDocument
{{ "_id", new BsonDocument {{"id",
"$UserSubscriptions.Subscription.Publication.Code"}, }},
{"Count", new BsonDocument {{"$sum", 1}} }}
}};
var pipeline = new[] { unWind, group };
var ff = _readOnlyAccess.GetDatabase(this._Database).GetCollection<T>
(this._Collection).Aggregate<T>(pipeline);
导致错误
FormatException: 无法从 BsonType 'Document'.
反序列化 'Int32'
只需使用$unwind
。此外,没有必要使用 $match
- $unwind
默认情况下会跳过空数组。
db.getCollection('User').aggregate([
{$unwind: '$UserSubscriptions'},
{$group: {
_id: '$UserSubscriptions.Subscription.Publication.Code',
count: {$sum: 1}
}}
])
编辑: 以上将多次计算客户中的多个代码,因此这是一个更新版本:
db.getCollection('User').aggregate([
{$unwind: '$UserSubscriptions'},
{$group: {
_id: '$_id',
codes: {$addToSet: '$UserSubscriptions.Subscription.Publication.Code'}
}},
{$unwind: '$codes'},
{$group: {
_id: '$codes',
count: {$sum: 1}
}}
])
我有一个用户 collection,它还有一个 'UserSubscription' collection,它还有一个 'Subscription > Publication'。
我在 Mongo
中关注了用户 collection/* 1 */
{
"_id" : 1,
"UserSubscriptions" : [
{
"_id" : 1,
"Subscription" : {
"_id" : 1,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
},
{
"_id" : 2,
"Subscription" : {
"_id" : 2,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
},
},
{
"_id" : 7,
"Subscription" : {
"_id" : 7,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
}
]
}
/* 2 */
{
"_id" : 2,
"UserSubscriptions" : [
{
"_id" : 3,
"Subscription" : {
"_id" : 3,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 3 */
{
"_id" : 3,
"UserSubscriptions" : [
{
"_id" : 4,
"Subscription" : {
"_id" : 4,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 4 */
{
"_id" : 4,
"UserSubscriptions" : [
{
"_id" : 5,
"Subscription" : {
"_id" : 5,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
}
}
]
}
我正在尝试获取所有 'Publication code' 和计数(用户订阅订阅计数)。所以从上面 collection 我想要这样的结果
PublicationCode Count (Number of users)
1MM 3
2MM 2
我试过 MongoDB 查询但没有得到实际结果
db.runCommand(
{ aggregate : "User", pipeline : [
{$match: { "UserSubscriptions.0": {$exists: true}} },
{$group: {_id:"$UserSubscriptions.Subscription.Publication.Code", count:{$sum:1}}},
{$project: {_id:1,count:1 } }
]}
);
请指教一些在 child collection
上使用组的方法(机器人 3T 1.2.1) (MongoDB.Driver 2.4.4)
对应的C#Mongo驱动查询为
var unWind = new BsonDocument
{
{ "$unwind", "$UserSubscriptions" }
};
var group = new BsonDocument
{{"$group",
new BsonDocument
{{ "_id", new BsonDocument {{"id",
"$UserSubscriptions.Subscription.Publication.Code"}, }},
{"Count", new BsonDocument {{"$sum", 1}} }}
}};
var pipeline = new[] { unWind, group };
var ff = _readOnlyAccess.GetDatabase(this._Database).GetCollection<T>
(this._Collection).Aggregate<T>(pipeline);
导致错误
FormatException: 无法从 BsonType 'Document'.
反序列化 'Int32'只需使用$unwind
。此外,没有必要使用 $match
- $unwind
默认情况下会跳过空数组。
db.getCollection('User').aggregate([
{$unwind: '$UserSubscriptions'},
{$group: {
_id: '$UserSubscriptions.Subscription.Publication.Code',
count: {$sum: 1}
}}
])
编辑: 以上将多次计算客户中的多个代码,因此这是一个更新版本:
db.getCollection('User').aggregate([
{$unwind: '$UserSubscriptions'},
{$group: {
_id: '$_id',
codes: {$addToSet: '$UserSubscriptions.Subscription.Publication.Code'}
}},
{$unwind: '$codes'},
{$group: {
_id: '$codes',
count: {$sum: 1}
}}
])