我开始使用mongoDb而且我遇到了一个简单的用例.
假设我有一个集合'aCollection',其条目如下:
{
_id: ObjectId(123),
lat: 48,56623,
long: 2,56332
}
Run Code Online (Sandbox Code Playgroud)
我想用这样的条目创建一个新的集合:
{
_id: ObjectId(123),
lat: 48,56623,
long: 2,56332,
geometry : {
type: "Point",
coordinates: [48,56623, 2,56332]
}
}
Run Code Online (Sandbox Code Playgroud)
我想到了聚合框架:
db.aCollection.aggregate([{$project: {
_id: 1,
lat: 1,
long: 1,
geometry: {
type: {$concat: ["Point"]},
coordinates: ["$lat", "$long"]
}
}}])
Run Code Online (Sandbox Code Playgroud)
但它不起作用,我得到这个例外:
"异常:对象表达式中不允许的字段类型数组(位于'坐标')"
以下聚合正在起作用,但它不会产生预期的结果:
db.aCollection.aggregate([{$project: {
_id: 1,
lat: 1,
long: 1,
geometry: {
type: {$concat: ["Point"]},
coordinates: "$lat"
}
}}])
Run Code Online (Sandbox Code Playgroud)
如何在没有聚合框架的情况下使用聚合框架2)继续创建此集合1)
谢谢
我有这3个请求:
db.mycollection.count({requestA:{$exists:true}})
db.mycollection.count({requestB:{$exists:true}})
db.mycollection.count({requestC:{$exists:true}})
Run Code Online (Sandbox Code Playgroud)
我只想提出一个请求......所以我尝试了以下方法:
db.mycollection.aggregate( [
{ $group: {
'_id' : { user_id: '$user_id'},
requestA_count: { $sum: {
$cond: [ {requestA:{'$exists':true}}, 1, 0 ]
} },
requestB_count: { $sum: {
$cond: [ {requestB:{'$exists':true}}, 1, 0 ]
} },
requestC_count: { $sum: {
$cond: [ {requestC:{'$exists':true}}, 1, 0 ]
} },
} },
{ $project: {
_id: 0,
user_id: '$_id.user_id',
requestA_count: 1,
requestB_count: 1,
requestC_count: 1
} }
] );
Run Code Online (Sandbox Code Playgroud)
但我得到了错误:
"errmsg" : "exception: invalid operator '$exists'",
Run Code Online (Sandbox Code Playgroud)
我想我们不能在$ project中使用$ exists. …
有没有什么方法可以使用符合以下条件的mongodb地理空间查询来查询和获取位置数据?
例如,下面我们可以在查询输出中只获得黄色区域内的那些位置,这些位置实际上是紫色和红色几何对象[多边形]的公共区域?

我到目前为止对mongodb文档的研究
这提供了一个或多个多边形内的结果[我正在寻找这些单个多边形结果作为输出的交集]
用例
db.places.find( {
loc: { $geoWithin: { $box: [ [ 0, 0 ], [ 100, 100 ] ] } }
} )
Run Code Online (Sandbox Code Playgroud)
上面的查询提供了一个矩形几何区域内的结果[我正在寻找两个这样的单个查询共有的位置]
db.places.find( {
loc: { $geoWithin: { $box: [ [ 0, 0 ], [ 100, 100 ] ] } }
} )
db.places.find( {
loc: { $geoWithin: { $box: [ [ 50, 50 ], [ 90, 120 ] ] } }
} )
Run Code Online (Sandbox Code Playgroud) javascript geospatial mongodb mongodb-query aggregation-framework
如果该字段不存在,$ push将聚合空值.我想避免这个.
有没有办法为$ push运算符创建一个子表达式,以便跳过空值而不将其推入结果数组?
如何在mongoDB中对每个组进行排序和限制.
考虑以下数据:
Country:USA,name:xyz,rating:10,id:x
Country:USA,name:xyz,rating:10,id:y
Country:USA,name:xyz,rating:10,id:z
Country:USA,name:abc,rating:5,id:x
Country:India,name:xyz,rating:5,id:x
Country:India,name:xyz,rating:5,id:y
Country:India,name:abc,rating:10,id:z
Country:India,name:abc,rating:10,id:x
Run Code Online (Sandbox Code Playgroud)
现在说我将按国家分组并按评级排序,并将每组的数据限制为2.
所以答案是:
Country:USA
name:xyz,rating:10,id:x
name:xyz,rating:10,id:y
Country:India
name:abc,rating:10,id:x
name:abc,rating:10,id:z
Run Code Online (Sandbox Code Playgroud)
我想只使用聚合框架来实现这一点.
我尝试将汇总排序用于评级,但只是查询在处理后没有结果.
我有一个像
{
"_id" : ObjectId("5738cb363bb56eb8f76c2ba8"),
"records" : [
{
"Name" : "Joe",
"Salary" : 70000,
"Department" : "IT"
}
]
},
{
"_id" : ObjectId("5738cb363bb56eb8f76c2ba9"),
"records" : [
{
"Name" : "Henry",
"Salary" : 80000,
"Department" : "Sales"
},
{
"Name" : "Jake",
"Salary" : 40000,
"Department" : "Sales"
}
]
},
{
"_id" : ObjectId("5738cb363bb56eb8f76c2baa"),
"records" : [
{
"Name" : "Sam",
"Salary" : 90000,
"Department" : "IT"
},
{
"Name" : "Tom",
"Salary" : 50000,
"Department" : "Sales" …Run Code Online (Sandbox Code Playgroud) 我保存我的交易,例如:
{code: "A", total: 250000, timestamp: ISODate("2016-01-20T23:57:05.771Z")},
{code: "B", total: 300000, timestamp: ISODate("2016-01-20T05:57:05.771Z")}
Run Code Online (Sandbox Code Playgroud)
每个事务都有timestampUTC时区下的字段.由于我住在雅加达(UTC + 7)时区,我需要在聚合之前将7小时添加到我的时间戳.这是我的mongo语法:
db.transaction.aggregate(
[
{
$project:
{
year: { $year: "$timestamp" },
month: { $month: "$timestamp" },
day: { $dayOfMonth: "$timestamp" }
}
}
])
Run Code Online (Sandbox Code Playgroud)
它返回:
{
"_id" : ObjectId("56a01ed143f2fd071793d63b"),
"year" : 2016,
"month" : 1,
"day" : 20
},
{
"_id" : ObjectId("56a01ed143f2fd071793d63b"),
"year" : 2016,
"month" : 1,
"day" : 20
}
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为第一次交易(代码A)发生在1月21日,但由于它被转换为UTC(-7小时),它变成了ISODate("2016-01-20T23:57:05.771Z")
注意:我在这里也知道同样的问题,这是我到目前为止所尝试过的:
db.transaction.aggregate( …Run Code Online (Sandbox Code Playgroud) 我正在尝试进行聚合查询"group"以获得结果总数.
"requested_items"(我的结果)总数为+ - 1.900.000.
如果我使用"group"执行,则查询非常慢(+ - 300秒).
如果我执行没有"组",查询速度非常快(+ - 1秒).
我究竟做错了什么?
示例代码如下.
慢慢的查询
db.minute.aggregate([
{ $match: {
$and: [
{ "status": "Homologado" },
{ "requested_items.status": /aceito/i },
]
} },
{ $sort: {'_id': 1}},
{ $unwind: "$requested_items" },
{ $unwind: "$requested_items.winner" },
{ $match: {
$and: [
{ "status": "Homologado" },
{ "requested_items.status": /aceito/i },
]
} },
{ $project: {
"_id": 1
} },
{ $group: {
"_id" : null,
"total" : {$sum: 1},
} }, …Run Code Online (Sandbox Code Playgroud) 我有一个类似于以下形式的决策文件集合:
{
_id: ObjectId("23de23802fe925b6ef7162a4"),
userId: 6de4,
decision: true,
datetime:ISODate("2016-07-27T08:22:47.169Z")
},
{
_id: ObjectId("507f1f77bcf86cd799439011"),
userId: 23f4,
decision: true,
datetime:ISODate("2016-02-03T11:48:50.456Z")
},
.
.
.
Run Code Online (Sandbox Code Playgroud)
我正在努力想出一种将这些文档分组为连续日期时间组的方法.即文档应该属于特定组,如果它小于,比如组中至少一个其他文档的5分钟.
目标是实现在"会话"中做出的决策群.然后可以使用聚合(例如每个决策的平均时间等)对这些"会话"组进行进一步的见解.
如果不能使用MongoDb的聚合框架,可以使用map-reduce或其他方法完成.我愿意接受建议.
描述问题的另一种方法是将以下算法应用于文档集合.
这将使集合具有所需的"会话"分组.当然,这只是描绘问题的一种方式.我不知道有什么方法可以遍历有序集合,同时使用MongoDb以这种方式进行分组.
可以这样做吗?有没有其他方法可以使用MongoDb获得相同的结果?
有两个收藏,标签和人.
标签型号:
{
en: String,
sv: String
}
Run Code Online (Sandbox Code Playgroud)
人物模型:
{
name: String,
projects: [
title: String,
tags: [
{
type: Schema.ObjectId,
ref: 'tag'
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
我想查询返回人员模型中使用的所有标签.所有文件.
有点喜欢
var query = mongoose.model('tag').find({...});
Run Code Online (Sandbox Code Playgroud)
或者我应该以某种方式使用聚合方法?
mongodb ×10
date ×1
datetime ×1
geospatial ×1
javascript ×1
mapreduce ×1
mongoose ×1
performance ×1
sorting ×1