我尝试在我的Node程序中使用mongodb的聚合方法时出现类型错误.我使用节点0.10.16版本和mongodb mongodb-win32-x86_64-2.4.2版本.
以下是我在mongodb中的'关系'表的详细信息 - `
db.relation.find().的forEach(printjson)
{ "_id" : ObjectId("518808811189128048034c7b") }
{
"username" : "51880fa37901642c36000001",
"selectedoption" : "RCB",
"question" : "Which team is going to win IPL6?",
"_id" : ObjectId("5188137dee3a599c34000001")
}
{
"username" : "51880fa37901642c36000001",
"selectedoption" : "Mumbai",
"question" : "Which team is going to win IPL6?",
"_id" : ObjectId("518c2bd0afa8d2e82b000001")
}
{
"username" : "51880fa37901642c36000001",
"selectedoption" : "Mumbai",
"question" : "Which team is going to win IPL6?",
"_id" : ObjectId("518c2c81681aae0838000001")
}
{
"username" : "51880fa37901642c36000001",
"selectedoption" : "RCB",
"question" : …Run Code Online (Sandbox Code Playgroud) 我正在对mongo 2.4.9集合进行一些聚合,但是我无法通过两个字段对结果进行排序.这是我使用PyMongo进行的查询:
result = mongo_coll.aggregate([{"$match": {"_cls": "class1"},
{"$group": {"_id": {"currency": "$total.currency",
"v_id": "$v_id"},
"total": {"$sum": "$total.amount"},
"count": {"$sum": 1}}},
{"$sort": {"_id.currency": 1, "total": -1}}])
Run Code Online (Sandbox Code Playgroud)
我的结果按"总计"排序: - 1
如果我用以下内容替换最后一行:
{"$sort": {"total": -1, "_id.currency": 1}}])
Run Code Online (Sandbox Code Playgroud)
它仍按"总计"排序: - 1
如果我用以下内容替换它:
{"$sort": {"_id.currency": 1}}])
Run Code Online (Sandbox Code Playgroud)
它按货币排序.
但我无法按照我想要的方式对其进行排序,这意味着首先是货币,然后是总数......(其他结果看起来很好,正如预期的那样).有人有线索吗?
最好的,并提前感谢!
更新:这是一个示例文档:
{
"_id": { "$oid" : "533d0a3b830f783478a75aa1" },
"_cls": "class1",
"v_id": 6813,
"total": {
"amount": 680,
"currency": "EUR",
"exp": -2
}
}
Run Code Online (Sandbox Code Playgroud) 我开始使用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. …
db.test.aggregate({
$match : { "themType" : "SuperTest" , "mType" : { "$in" : [ 1 , 2]}}
},
{ $project : { "_id" : 1, "refTestId" : 1, "avatar" : { $concat : [$refTestId] }
} });
Run Code Online (Sandbox Code Playgroud)
和avatar返回null,可能是因为它的objectId,是否可以在此查询中使用此objectId字符串?
如果该字段不存在,$ 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) 我有一个类似于以下形式的决策文件集合:
{
_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获得相同的结果?
我想执行一个执行基本分页的聚合查询:
company_idorder_number100并传递其余部分2并传递它们以下是查询的细分:
db.Order.collection.aggregate([
Run Code Online (Sandbox Code Playgroud)
这会找到所有匹配的文档:
{ '$match' : { "company_id" : ObjectId("54c0...") } },
Run Code Online (Sandbox Code Playgroud)
这会对文件进行排序:
{ '$sort' : { 'order_number' : -1 } },
Run Code Online (Sandbox Code Playgroud)
这会对文档进行计数并传递未经修改的文档,但我确信这样做是错误的,因为事情变得怪异了:
{
'$group' : {
'_id' : null,
'count' : { '$sum' : 1 },
'entries' : { '$push' : "$$ROOT" }
}
},
Run Code Online (Sandbox Code Playgroud)
这似乎跳过一些文件:
{ "$skip" : 100 },
Run Code Online (Sandbox Code Playgroud)
这应该限制文档,但它不会:
{ "$limit" : 2 },
Run Code Online (Sandbox Code Playgroud)
这会返回计数,但它不会返回数组中的文档,而是返回包含每个字段的数组:
{ '$project' : {
'count' : 1,
'entries' …Run Code Online (Sandbox Code Playgroud)