我有一组用户,每个文档都有以下结构:
{
"_id": "<id>",
"login": "xxx",
"solved": [
{
"problem": "<problemID>",
"points": 10
},
...
]
}
Run Code Online (Sandbox Code Playgroud)
该字段solved可能为空或包含任意多个子文档.我的目标是获得一个用户列表以及总分(总和points),其中尚未解决任何问题的用户将被分配总分为0.这是否可以通过单个查询执行此操作(理想情况下使用聚合框架)?
我试图在聚合框架中使用以下查询:
{ "$group": {
"_id": "$_id",
"login": { "$first": "$login" },
"solved": { "$addToSet": { "points": 0 } }
} }
{ "$unwind": "$solved" }
{ "$group": {
"_id": "$_id",
"login": { "$first": "$login" },
"solved": { "$sum": "$solved.points" }
} }
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
exception: The top-level _id field is the only field currently supported for exclusion
Run Code Online (Sandbox Code Playgroud)
先感谢您
我正在使用mongodb聚合框架并进行一些计算,如下所示
db.RptAgg.aggregate(
{ $group :
{ _id : {Region:"$RegionTxt",Mth:"$Month"},
ActSls:{$sum:"$ActSls"},
PlnSls:{$sum:"$PlnSls"}
}
},
{ $project :
{
ActSls:1,
PlnSls:1,
ActToPln:{$cond:[{ $ne: ["$PlnSls", 0] },{$multiply:[{$divide: ['$ActSls', '$PlnSls']},100]},0]}
}
}
);
Run Code Online (Sandbox Code Playgroud)
我想弄清楚将结果舍入到2位小数的最佳和最简单的方法是什么.以下是我的结果
{
"result" : [
{
"_id" : {
"Region" : "East",
"Mth" : 201301
},
"ActSls" : 72,
"PlnSls" : 102,
"ActToPln" : 70.58823529411765
}
],
"ok" : 1
Run Code Online (Sandbox Code Playgroud)
}
我希望"ActToPln"在aggegation框架本身的结果中显示70.59而不是"ActToPln":70.58823529411765.我想避免在我的应用程序中进行舍入
你能帮忙吗?
以下是我使用的数据集.
{
"_id" : ObjectId("51d67ef69557c507cb172572"),
"RegionTxt" : "East",
"Month" : 201301,
"Date" …Run Code Online (Sandbox Code Playgroud) 我无法使用聚合管道限制组函数中推送元素的数量.这可能吗?小例子:
数据:
[
{
"submitted": date,
"loc": {
"lng": 13.739251,
"lat": 51.049893
},
"name": "first",
"preview": "my first"
},
{
"submitted": date,
"loc": {
"lng": 13.639241,
"lat": 51.149883
},
"name": "second",
"preview": "my second"
},
{
"submitted": date,
"loc": {
"lng": 13.715422,
"lat": 51.056384
},
"name": "nearpoint2",
"preview": "my nearpoint2"
}
]
Run Code Online (Sandbox Code Playgroud)
这是我的聚合管道:
var pipeline = [{
//I want to limit the data to a certain area
$match: {
loc: {
$geoWithin: {
$box: [
[locBottomLeft.lng, locBottomLeft.lat],
[locUpperRight.lng, locUpperRight.lat]
] …Run Code Online (Sandbox Code Playgroud) 我如何在Mongoose中使用聚合和find一起?
即我有以下架构:
const schema = new Mongoose.Schema({
created: { type: Date, default: Date.now() },
name: { type: String, default: 'development' }
followers: [{ type: Mongoose.Schema.ObjectId, ref: 'Users'}]
...
})
export default Mongoose.model('Locations', schema)
Run Code Online (Sandbox Code Playgroud)
如何仅使用字段name和查询用户followers_count.
followers_count:长度followers.
在那里,我知道我们可以使用select来获得该字段name.
我们怎么能算得上followers?
mongoose mongodb node.js mongodb-query aggregation-framework
我试图按小时聚合MongoDB colloection中的记录,并需要将存储为timestamp(毫秒)的日期转换为ISODate,以便我可以使用聚合框架的内置日期运算符($ hour,$ month等)
记录存储为
{
"data" : { "UserId" : "abc", "ProjId" : "xyz"},
"time" : NumberLong("1395140780706"),
"_id" : ObjectId("532828ac338ed9c33aa8eca7")
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下类型的聚合查询:
db.events.aggregate(
{
$match : {
"time" : { $gte : 1395186209804, $lte : 1395192902825 }
}
},
{
$project : {
_id : "$_id",
dt : {$concat : (Date("$time")).toString()} // need to project as ISODate
}
},
// process records further in $project or $group clause
)
Run Code Online (Sandbox Code Playgroud)
产生以下形式的结果:
{
"result" : [
{
"_id" : ObjectId("5328da21fd207d9c3567d3ec"),
"dt" …Run Code Online (Sandbox Code Playgroud) 我是MongoDB聚合的新手,想知道是否有办法使用MongoDB聚合框架计算中值?
干杯,
刘易斯
如何在$ lookup之后添加过滤器,还是有其他方法可以执行此操作?
我的数据收集测试是:
{ "_id" : ObjectId("570557d4094a4514fc1291d6"), "id" : 100, "value" : "0", "contain" : [ ] }
{ "_id" : ObjectId("570557d4094a4514fc1291d7"), "id" : 110, "value" : "1", "contain" : [ 100 ] }
{ "_id" : ObjectId("570557d4094a4514fc1291d8"), "id" : 120, "value" : "1", "contain" : [ 100 ] }
{ "_id" : ObjectId("570557d4094a4514fc1291d9"), "id" : 121, "value" : "2", "contain" : [ 100, 120 ] }
Run Code Online (Sandbox Code Playgroud)
我选择id 100并聚合孩子:
db.test.aggregate([ {
$match : {
id: 100
}
}, {
$lookup …Run Code Online (Sandbox Code Playgroud) 在应用最后阶段的聚合后,我们可以从 MongoDB 指南针“聚合”部分导出聚合数据吗?就像我们可以使用“文档”部分下的“导出数据”选项轻松完成此操作,我们可以选择将其导出为 JSON 和 CSV。我只看到从左侧导出聚合代码的选项。
我有一个我正在进行聚合的集合,我基本上已经把它归结为
{array:[1,2,3], value: 1},
{array:[1,2,3], value: 4}
Run Code Online (Sandbox Code Playgroud)
如何执行聚合匹配以检查值是否在数组中?我尝试使用,{$match: {"array: {$in: ["$value"]}}}但它没有找到任何东西.
我希望输出(如果使用上面的例子)是:
{array:[1,2,3], value:1}
Run Code Online (Sandbox Code Playgroud) 这是我的收藏:
collection1:
{
user1: 1,
user2: 2,
percent: 0.56
}
Run Code Online (Sandbox Code Playgroud)
collection2:
{
user1: 1,
user2: 2,
percent: 0.3
}
Run Code Online (Sandbox Code Playgroud)
我希望通过'user1'和'user2'加入这两个集合.
结果如下:
{
user1: 1,
user2: 2,
percent1: 0.56,
percent2: 0.3
}
Run Code Online (Sandbox Code Playgroud)
我该如何编写管道?