我正在使用MongoDB聚合框架,需要获取金额字段的绝对值,我在项目部分和组部分中使用,ex:
'$project' => {
'amount' => 1,
'_id' => 0
}
Run Code Online (Sandbox Code Playgroud)
....
'$group' => {
'total' => {'$sum' => '$amount'}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您如何获取"金额"字段的绝对值?我无法在文档中找到它(也许它不可用?)
假设我们收到了一组用户,每个用户都以BSON类型的日期格式生日.
我们如何运行查询以查找在接下来的30天内过生日的所有用户?
我正在尝试对样本bios集合http://docs.mongodb.org/manual/reference/bios-example-collection/进行查询:
在获得图灵奖之前,检索他们收到的所有人及其奖励.
我想出了这个问题:
db.bios.aggregate([
{$match: {"awards.award" : "Turing Award"}},
{$project: {"award1": "$awards", "award2": "$awards", "first_name": "$name.first", "last_name": "$name.last"}},
{$unwind: "$award1"},
{$match: {"award1.award" : "Turing Award"}},
{$unwind: "$award2"},
{$redact: {
$cond: {
if: { $eq: [ { $gt: [ "$award1.year", "$award2.year"] }, true]},
then: "$$KEEP",
else: "$$PRUNE"
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
这就是答案:
/* 0 */
{
"result" : [
{
"_id" : 1,
"award1" : {
"award" : "Turing Award",
"year" : 1977,
"by" : "ACM"
},
"award2" : …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" : 3, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "final" : 78, "midterm" : 70 }
{ "_id" : 1, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "midterm" : 70 }
Run Code Online (Sandbox Code Playgroud)
如果我运行以下查询:
db.students.aggregate([ { "$project": { "midterm": 1,"final": 1 } } ])
Run Code Online (Sandbox Code Playgroud)
结果如下:
{ "_id" : 3, "final" : 78, "midterm" : 70 }
{ "_id" : 1, "midterm" : 70 }
Run Code Online (Sandbox Code Playgroud)
如果我仍然在shell中更改投影中的顺序,则字段的顺序是相同的?我们可以根据查询的顺序重新获得订单吗?
db.students.aggregate([ { …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获得相同的结果?
结构或多或少像;
[
{id: 1, name: "alex" , children: [2, 4, 5]},
{id: 2, name: "felix", children: []},
{id: 3, name: "kelly", children: []},
{id: 4, name: "hannah", children: []},
{id: 5, name: "sonny", children: [6]},
{id: 6, name: "vincenzo", children: []}
]
Run Code Online (Sandbox Code Playgroud)
children当children数组不为空时,我想用名称替换id .
所以查询的结果是预期的;
[ {id: 1, name: "alex" , children: ["felix", "hannah" , "sonny"]}
{id: 5, name: "sonny", children: ["vincenzo"]}
]
Run Code Online (Sandbox Code Playgroud)
我做了什么来实现这一目标;
db.list.aggregate([
{$lookup: { from: "list", localField: "id", foreignField: "children", as: "children" }},
{$project: …Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要在两个表之间进行$ lookup的查询,据我所知,对ForeignField拥有索引以便及时执行此连接至关重要。但是,即使在字段上添加了索引之后,查询仍然会回退到COLLSCAN。
db.users.aggregate([
{$lookup:{ from: "transactions", localField: '_id', foreignField: 'uid', as: 'transaction' }},
{ $match: { transaction: { "$size" : 0} } },
{ $count: "total"},
], { explain: true })
Run Code Online (Sandbox Code Playgroud)
返回:
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.users",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
Run Code Online (Sandbox Code Playgroud)
如前所述,我确实在事务集合中索引了uid字段:
> db.transactions.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
}, …Run Code Online (Sandbox Code Playgroud) 我想执行一个执行基本分页的聚合查询:
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) {
"ArticleName": "Example Article",
"Comments": [
{
"Text": "Great Article",
"Responses": [
{
"Text": "No it isnt",
"Responses": [
{
"Text": "Yes it is"
}
]
},
{
"Text": "Spot on"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
每次出现的关键"文本"都会被视为注释(因此有4条评论).在Mongo中,最好的方法是什么?