MongoDB有一个新的聚合框架,我试图弄清楚如何将它与Mongoid一起使用.似乎有一个Moped分支具有此处讨论的此功能.我已经更新到MongoDB 2.2并尝试在我的应用程序上安装这个Moped分支,如下所示:
gem'pedped',git:'git://github.com/mongoid/moped.git',branch:'aggregation-support'
但聚合仍然无效.这是我用来测试它的电话:
= Post.all.aggregate({"$ group"=> {"_ id"=>"$ _id"}})
UPDATE
在mongo shell中,这可以工作:
db.users.aggregate({$ group:{_ id:"$ _id"}})
所以我认为这是一个Mongoid问题......任何关于这个的话都会很棒!
所以我需要一个在MongoDB中计算的自定义字段,如下所示
if( field1 =="A") ->customfield=10
else if(field1 =="B" )->customfield=20
else (field1 =="C" ) ->customfield=15
Run Code Online (Sandbox Code Playgroud)
我正在使用聚合以及$ project语句.但$ cond运算符不允许elseif(subbranching else)并且只允许两个静态分支if和else.使用嵌套的elseif原因
"exception: field inclusion is not allowed inside of $expressions"
继承人我的查询(这给了我错误)
db.items.aggregate([ { $project :
{
name: 1,
customfield:
{
$cond: { if: { $eq: [ "$field1", "4" ] }, then: 30,
else: {
if:
{ $eq: ["$field1","8"]},
then: 25, else: 10}}
}
}},{ $sort: { customfield: 1 }},{$limit:12}]);
Run Code Online (Sandbox Code Playgroud)
有没有一种方法或解决方法.如果这是一个重复的问题我很抱歉,但我找不到类似的问题.
我在mongodb有这个收藏
{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
{
"name" : "name1",
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想找到基于someArray.someNestedArray.name的文档,但我找不到任何有用的链接所有关于更新嵌套数组的搜索结果我正在尝试这个但是什么都不返回
db.mycollection.find({"someArray.$.someNestedArray":{"$elemMatch":{"name":"1"}}})
db.mycollection.find({"someArray.$.someNestedArray.$.name":"1"})
Run Code Online (Sandbox Code Playgroud)
还有别的东西
我如何通过双嵌套数组mongodb中的元素找到?
我需要你帮助将MongoDB聚合框架与java驱动程序一起使用.即使有这个文档,我也不明白如何编写我的请求.
我想从我的收藏中的所有项目中获取200个最旧的视图.这是我的mongo查询(在控制台模式下工作方式如下):
db.myCollection.aggregate(
{$unwind : "$views"},
{$match : {"views.isActive" : true}},
{$sort : {"views.date" : 1}},
{$limit : 200},
{$project : {"_id" : 0, "url" : "$views.url", "date" : "$views.date"}}
)
Run Code Online (Sandbox Code Playgroud)
此集合中的项目具有一个或多个视图.我的问题不是关于请求结果,我想知道java语法.
我有mongo查询,它对文档进行组操作.
我几乎得到了预期的结果,除了我想要在没有空值或空值的情况下优化结果.
目前我的查询如下所示:
db.productMetadata.aggregate([{$group:{"_id":{"color":"$productAttribute.colour","gender":"$productAttribute.gender"},"count" : {$sum : 1}}}]);
Run Code Online (Sandbox Code Playgroud)
结果看起来像这样:
{ "_id" : { "color" : "BLUE", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { }, "count" : 4 }
{ "_id" : { "color" : "NA", "gender" : "WOMEN" }, "count" : 1 }
{ "_id" : { "color" : "BLACK", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { "color" : "BROWN", "gender" : "WOMEN" }, "count" : 1 }
{ "_id" …Run Code Online (Sandbox Code Playgroud) mongodb mongodb-query aggregation-framework mongodb-aggregation
我有两个系列
用户
{
"_id" : ObjectId("584aac38686860d502929b8b"),
"name" : "John"
}
Run Code Online (Sandbox Code Playgroud)角色
{
"_id" : ObjectId("584aaca6686860d502929b8d"),
"role" : "Admin",
"userId" : "584aac38686860d502929b8b"
}
Run Code Online (Sandbox Code Playgroud)我想基于userId(在角色集合中) - _id(在用户集合中)加入这些集合.
我尝试了以下查询:
db.role.aggregate(
{
$lookup:
{
from: 'user',
localField: 'userId',
foreignField: '_id',
as: 'output'
}
}
);
Run Code Online (Sandbox Code Playgroud)
只要我将userId存储为ObjectId,这就给了我预期的结果.当我的userId是一个字符串时,没有结果.Ps:我试过了
foreignField:'_ id'.valueOf()
和
foreignField:'_ id'.toString()
.但是基于ObjectId-string字段匹配/加入没有运气.
任何帮助将不胜感激.
我有一个包含created_date属性的文档集合.我想通过聚合管道发送这些文档来对它们进行一些工作.理想情况下,我想在我对其进行任何其他工作之前使用$ match过滤它们以便我可以利用索引但是我无法弄清楚如何使用我的新$ year/$ month/$ dayOfMonth运算符$ match表达式.
在$ project操作中如何使用运算符有一些例子,但是我担心通过将$ project放在我的管道中的第一步然后我就失去了对索引的访问权限(MongoDB文档表明第一个表达式必须是$ match才能利用索引).
样本数据:
{
post_body: 'This is the body of test post 1',
created_date: ISODate('2012-09-29T05:23:41Z')
comments: 48
}
{
post_body: 'This is the body of test post 2',
created_date: ISODate('2012-09-24T12:34:13Z')
comments: 10
}
{
post_body: 'This is the body of test post 3',
created_date: ISODate('2012-08-16T12:34:13Z')
comments: 10
}
Run Code Online (Sandbox Code Playgroud)
我想通过聚合管道来运行它,以获得9月份所有帖子的总评论
{
aggregate: 'posts',
pipeline: [
{$match:
/*Can I use the $year/$month operators here to match Sept 2012?
$year:created_date : 2012,
$month:created_date : 9 …Run Code Online (Sandbox Code Playgroud) 我想将聚合框架结果保存到新集合中.我知道目前使用命令本身的框架是不可能的.
shell中有解决方法吗?
我有文件看起来像这样:
{
"_id" : "someuniqueeventid",
"event" : "event_type_1",
"date" : ISODate("2014-01-14T00:00:00Z"),
}
Run Code Online (Sandbox Code Playgroud)
我想按" event" 进行分组,并计算每周每天发生的事件类型的数量.基本上,我希望得到类似的东西:
{
"_id": "event_type_1",
"1": "number of event_type_1 for Monday",
"2": "number of event_type_1 for Tuesday",
...
},
{
"_id": "event_type_2",
...
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我坚持:
db.data.aggregate([ {$project: {date_of_week: {$dayOfWeek: "$date"}, event: "$event"}},
{$group: {_id: "$event", .... } ])
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我现在正处于这种情况:我有一个集合X:
{
_id:ObjectId('56edbb4d5f084a51131dd4c6'),
userRef:ObjectId('56edbb4d5f084a51131dd4c6'),
serialNumber:'A123123',
...
}
Run Code Online (Sandbox Code Playgroud)
我需要聚合所有文档,用userRef + serialNumber对它们进行分组,所以我试图像这样使用concat:
$group: {
_id: {
'$concat': ['$userRef','-','$serialNumber']
},
...
Run Code Online (Sandbox Code Playgroud)
所以基本上在我在MongoDB中的聚合中,我需要通过ObjectId和字符串的串联来分组文档.但是,似乎$ concat只接受字符串作为参数:
uncaught exception: aggregate failed: {
"errmsg" : "exception: $concat only supports strings, not OID",
"code" : 16702,
"ok" : 0
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将ObjectId转换为聚合表达式中的String?
编辑:
这个问题是相关的,但我的解决方案不适合我的问题.(特别是因为我在聚合期间不能使用ObjectId.toString())
实际上我在Mongo的文档中找不到任何ObjectId().toString()操作,但我想知道在这种情况下是否有任何棘手的事情可以做.