这是我的问题:
模型:
{application:"abc",date:Time.now,status:"1"user_id:[id1,id2,id4]}
{application:"abc",date:Time.yesterday,status:"1",user_id:[id1,id3,id5]}
{application:"abc",date:Time.yesterday-1,status:"1",user_id:[id1,id3,id5]}
我需要在一段时间内计算user_id的唯一数量.
预期结果:
{application:"abc",status:"1",unique_id_count:5}
我目前正在使用聚合框架并计算mongodb之外的ID.
{$ match:{application:"abc"}},{$ unwind:"$ users"},{$ group:{_ id:{status:"$ status"},users:{$ addToSet:"$ users"} }}
我的用户ID数组非常大,所以我必须迭代日期或者我将获得最大文档限制(16mb).
我也可以分组
{year:{$ year:"$ date"},month:{$ month:"$ date"},day:{$ dayOfMonth:"$ date"}
但我也得到了文件大小限制.
是否可以计算mongodb中的设置大小?
谢谢
有没有办法将$ addToSet的结果作为排序数组?
我试图扩展管道和$展开数组,对它进行排序并再次分组,但结果仍然没有排序.
数组非常大,我试图避免在应用程序中对它们进行排序.
Document Example :
{
"_id" : ObjectId("52a84825cc8391ab188b4567"),
"id" : 129624
"message" : "Sample",
"date" : "12-09-2013,17:34:34",
"dt" : ISODate("2013-12-09T17:34:34.000Z"),
}
查询:
db.uEvents.aggregate(
[
{$match : {dt : {$gte : new Date(2014,01,01) , $lt : new Date(2015,01,17)}}}
,{$sort : {dt : 1}}
, {$group : {
_id : {
id : "$id"
, year : {'$year' : "$dt"}
, month : {'$month' : "$dt"}
, day : {'$dayOfMonth' : "$dt"}
}
,dt : {$addToSet : "$dt"}
}} … 以下是聚合查询:
[
{
"$match": {
"UserId": {
"$in": [
5
]
},
"WorkflowStartTime": {
"$gte": ISODate('2015-04-09T00:00:00.000Z'),
"$lte": ISODate('2015-04-16T00:00:00.000Z')
}
}
},
{
"$group": {
"_id": {
"Task": "$TaskId",
"WorkflowId": "$WorkflowInstanceId"
},
"TaskName": {
"$first": "$Task"
},
"StartTime": {
"$first": "$StartTime"
},
"EndTime": {
"$last": "$EndTime"
},
"LastExecutionTime": {
"$last": "$StartTime"
},
"WorkflowName": {
"$first": "$WorkflowName"
}
}
},
{
"$project": {
"_id": 1,
"LastExecutionTime": 1,
"TaskName": 1,
"AverageExecutionTime": {
"$subtract": [
"$EndTime",
"$StartTime"
]
},
"WorkflowName": 1
}
},
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取数据库中包含最多条目的人员列表.
print db.points.aggregate(
[
{
"$group":
{
"_id": "$created.user",
"count":{"$sum":1}
}
},
{
"$sort":
{"count":-1}
}
]
)
Run Code Online (Sandbox Code Playgroud)
条目如下所示:
{
u'id': u'342902',
u'_id': ObjectId('555af76a029d3b1b0ff9a4be'),
u'type': u'node',
u'pos': [48.9979746, 8.3719741],
u'created': {
u'changeset': u'7105928',
u'version': u'4',
u'uid': u'163673',
u'timestamp': u'2011-01-27T18:05:54Z',
u'user': u'Free_Jan'
}
}
Run Code Online (Sandbox Code Playgroud)
我知道created.user存在并且可以访问.
我得到的输出仍然是:
<pymongo.command_cursor.CommandCursor object at 0x02ADD6B0>
我不应该得到一个排序列表?
我正在使用meteorhacks:聚合包来在Meteor中进行Mongo聚合.我想在管道的最后阶段得到计数,所以我使用这段代码:
Message.aggregate([
{
$match: {
// ...
}
}, {
$count: 'count'
}
]);
Run Code Online (Sandbox Code Playgroud)
这很简单,应该可以工作,但我只收到这个错误:
Exception while invoking method 'methodname'
MongoError: Unrecognized pipeline stage name: '$count'
...
Run Code Online (Sandbox Code Playgroud)
请帮忙,谢谢.
更新:这个问题不像编辑建议的那样重复,我的主要目的是找出为什么我不能使用$count
我有两个系列
帖子:
{
"_Id": "1",
"_PostTypeId": "1",
"_AcceptedAnswerId": "192",
"_CreationDate": "2012-02-08T20:02:48.790",
"_Score": "10",
...
"_OwnerUserId": "6",
...
},
...
Run Code Online (Sandbox Code Playgroud)
和用户:
{
"_Id": "1",
"_Reputation": "101",
"_CreationDate": "2012-02-08T19:45:13.447",
"_DisplayName": "Geoff Dalgas",
...
"_AccountId": "2"
},
...
Run Code Online (Sandbox Code Playgroud)
我想找到写5到15个帖子的用户.这是我的查询的样子:
db.posts.aggregate([
{
$lookup: {
from: "users",
localField: "_OwnerUserId",
foreignField: "_AccountId",
as: "X"
}
},
{
$group: {
_id: "$X._AccountId",
posts: { $sum: 1 }
}
},
{
$match : {posts: {$gte: 5, $lte: 15}}
},
{
$sort: {posts: -1 }
},
{
$project : …Run Code Online (Sandbox Code Playgroud) 我正在使用 mongodb 的节点驱动程序在具有许多连续更新的字段的文档上启动更改流(通过插入/更新端的某些逻辑调用$set仅包含更改的字段),但我想仅监视特定字段的更改。我目前对此的尝试如下,但即使该字段不是更新的一部分,我也只会获得每次更新。
我认为“updateDescription.updatedFields”是我所追求的,但到目前为止我拥有的代码只是给了我所有的更新。
正确的 $match 过滤器会是什么样子来实现这样的目标?我想也许检查它是否是 $gte:1 可能是让它工作的黑客,但我仍然只是得到每个更新。我试过 $inc 来查看字段名称是否也在“updatedFields”中,但这似乎也不起作用。
const MongoClient = require('mongodb').MongoClient;
const uri = 'mongodb://localhost:27017/?replicaSet=rs0';
MongoClient.connect(uri, function(err, client) {
const db = client.db('mydb');
// Connect using MongoClient
var filter = {
$match: {
"updateDescription.updatedFields.SomeFieldA": { $gte : 1 },
operationType: 'update'
}
};
var options = { fullDocument: 'updateLookup' };
db.collection('somecollection').watch(filter, options).on('change', data => {
console.log(new Date(), data);
});
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试聚合一批文件.我想要推送的文件中有两个字段.但是,假设它们是"_id"和"A"字段,我只想要$ push"_id"和"A"如果"A"是$ gt 0.
我尝试了两种方法.
第一.
db.collection.aggregate([{
"$group":{
"field": {
"$push": {
"$cond":[
{"$gt":["$A", 0]},
{"id": "$_id", "A":"$A"},
null
]
}
},
"secondField":{"$push":"$B"}
}])
Run Code Online (Sandbox Code Playgroud)
但这会将空值推到"字段",我不想要它.
第二个.
db.collection.aggregate([{
"$group":
"field": {
"$cond":[
{"$gt",["$A", 0]},
{"$push": {"id":"$_id", "A":"$A"}},
null
]
},
"secondField":{"$push":"$B"}
}])
Run Code Online (Sandbox Code Playgroud)
第二个根本不起作用......
有没有办法在其他情况下跳过$ push?
添加:
预期文件:
{
"_id":objectid(1),
"A":2,
"B":"One"
},
{
"_id":objectid(2),
"A":3,
"B":"Two"
},
{
"_id":objectid(3),
"B":"Three"
}
Run Code Online (Sandbox Code Playgroud)
预期产出:
{
"field":[
{
"A":"2",
"_id":objectid(1)
},
{
"A":"3",
"_id":objectid(2)
},
],
"secondField":["One", "Two", "Three"]
}
Run Code Online (Sandbox Code Playgroud) REF:来自具有字段值 max 的数组的 MongoDB 文档
查找文档中的子数组中的最高值和MongoDB查找文档数组中的最大值中的答案建议使用排序+限制(1),但这确实很慢。当然有一种方法可以使用 $max 运算符。
假设在聚合匹配中获得这样的文档:
{
_id: "notImportant",
array: [
{
name: "Peter",
age: 17
},
{
name: "Carl",
age: 21
},
{
name: "Ben",
age: 15
}
]
}
Run Code Online (Sandbox Code Playgroud)
您想要找到年龄最高的(整个,而不仅仅是一个值)文档。如何使用 $max 运算符做到这一点?
我试过
unwind {"$array"}
project {"_id": 0, "name": "$array.name", "age": "$array.age"}
Run Code Online (Sandbox Code Playgroud)
所以我得到
{
_id: null,
name: "Peter",
age: 17
}
{
_id: null,
name: "Carl",
age: 21
}
{
_id: null,
name: "Ben",
age: 15
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试匹配年龄:
age: {$eq: {$max: …Run Code Online (Sandbox Code Playgroud) 我试图使用Mongo中的聚合框架获得整个字段的平均值.但是,我似乎无法找到任何使用它而没有组参数的示例.
我有以下文档结构:
{
"_id" : ObjectId("5352703b61d2739b2ea44e4d"),
"Semana" : "2014-02-23 - 2014-03-01",
"bolsaDeValores" : "7",
"bvc" : "8",
"dollar" : "76",
"ecopetrol" : "51",
"dollarPrice" : "18"
}
Run Code Online (Sandbox Code Playgroud)
基本上我想要做的是以最快的方式获得整个集合的bvc字段和任何其他数字字段的平均值(不使用MapReduce,因为它比聚合框架效率低).
我试图在大于零的基础上进行分组,但无济于事:
db.EvaluatedSentiments.aggregate([
{ "$group": {
"bvc" : {"$gt:0"}
},
{
"bvc" : { "$avg" : "$bvc"}
}
}
])
Run Code Online (Sandbox Code Playgroud)
我感谢您提供的任何帮助.
参考文献:Mongo聚合手册