标签: aggregation-framework

Node.js - TypeError:无法读取undefined的属性'readPreference'

我尝试在我的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)

mongodb node.js aggregation-framework

8
推荐指数
1
解决办法
1万
查看次数

Mongo聚合框架无法按两个字段排序?

我正在对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)

sorting mongodb pymongo aggregation-framework

8
推荐指数
1
解决办法
3492
查看次数

如何使用聚合框架创建新的数组字段

我开始使用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)

谢谢

mongodb mongodb-query aggregation-framework

8
推荐指数
2
解决办法
9970
查看次数

MongoDB,多次计数(使用$ exists)

我有这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-query aggregation-framework

8
推荐指数
1
解决办法
4117
查看次数

mongodb聚合项目objectId与concat

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字符串?

mongodb aggregation-framework

8
推荐指数
1
解决办法
1013
查看次数

如何避免在mongo聚合框架中推送$推送空值

如果该字段不存在,$ push将聚合空值.我想避免这个.

有没有办法为$ push运算符创建一个子表达式,以便跳过空值而不将其推入结果数组?

mongodb mongodb-query aggregation-framework

8
推荐指数
2
解决办法
6112
查看次数

使用聚合在mongoDB中限制和排序每个组

如何在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)

我想只使用聚合框架来实现这一点.

我尝试将汇总排序用于评级,但只是查询在处理后没有结果.

sorting mongodb mongodb-query aggregation-framework

8
推荐指数
1
解决办法
4216
查看次数

如何使用相应文档的数组获取每个组的字段的最大值?

我有一个像

{
    "_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)

mongodb mongodb-query aggregation-framework

8
推荐指数
1
解决办法
1446
查看次数

如何将Mongodb时间点数据分组到连续的时间组?

我有一个类似于以下形式的决策文件集合:

    { 
    _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或其他方法完成.我愿意接受建议.

澄清

描述问题的另一种方法是将以下算法应用于文档集合.

  1. 首先将文档放入日期时间顺序.
  2. 将最早出现的文件(按时间顺序排列)放在自己的 组中,然后转到下一个文档.
  3. 如果下一个文档的日期时间小于一个文档之后的指定时间(比如5分钟),则将其放在之前相同的组中.如果没有,请创建一个新组并将此文档放入其中.
  4. 重复步骤3.直到遍历所有文档.

这将使集合具有所需的"会话"分组.当然,这只是描绘问题的一种方式.我不知道有什么方法可以遍历有序集合,同时使用MongoDb以这种方式进行分组.

可以这样做吗?有没有其他方法可以使用MongoDb获得相同的结果?

mapreduce mongodb mongodb-query aggregation-framework

8
推荐指数
1
解决办法
209
查看次数

如何使用MongoDB聚合进行分页?

我想执行一个执行基本分页的聚合查询:

  1. 查找属于某个特定的所有订单 company_id
  2. 按顺序排序 order_number
  3. 计算文件总数
  4. 跳到例如文档编号100并传递其余部分
  5. 将文档数量限制为例如2并传递它们
  6. 通过从文档中返回计数和选定的几个字段来完成

以下是查询的细分:

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)

pagination mongodb aggregation-framework

8
推荐指数
2
解决办法
8969
查看次数