标签: aggregation-framework

比较MongoDB中的两个日期字段

在我的收藏中,每个文档都有2个日期,修改和同步.我想找到那些修改>同步或同步不存在的那些.

我试过了

{'modified': { $gt : 'sync' }}
Run Code Online (Sandbox Code Playgroud)

但它没有表现出我的预期.有任何想法吗?

谢谢

datetime mongodb node.js mongodb-query aggregation-framework

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

如何从数组内的文档中投影特定字段?

这是一个典型的文件

{
   title : 'someTitle',
   places : [{name : 'someName', location : 'someLocation'}, {name ...}]
}
Run Code Online (Sandbox Code Playgroud)

我有以下查询

var qs = {title : 'someTitle', places : {$elemMatch : {name : 'someName' } } };
Run Code Online (Sandbox Code Playgroud)

我选择一个与标题匹配的文档,其中包含名称等于'someName'的'places'数组中的文档条目.但问题是places数组中的条目是大文档,我只需要该文档中的几个字段.我尝试像这样投射字段,但它没有用.

var projection = {'places.$.name': 1, 'places.$.location' : 1};
Run Code Online (Sandbox Code Playgroud)

应该返回一个包含仅包含'name''location'属性的文档的数组.

我收到以下错误

Can't canonicalize query: BadValue Cannot specify more than one positional proj. per query.  
Run Code Online (Sandbox Code Playgroud)

要清楚,我想在没有聚合框架的情况下实现这一目标

mongoose mongodb mongodb-query aggregation-framework

10
推荐指数
2
解决办法
7679
查看次数

使用$ project阶段中的$ in运算符过滤数组

现在,在$ filter数组聚合运算符中不可能使用$ in运算符.

假设这是文档架构:

{
    _id: 1,
    users: [
        {
            _id: 'a',
            accounts: ['x', 'y', 'z']
        },
        {
            _id: 'b',
            accounts: ['j','k','l']
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我希望,使用aggregate,users根据数组的内容获取带有过滤数组的文档accounts.

如果$in将与合作$filter运营商,我希望它看起来像这样:

db.test.aggregate([
    {
        $project: {
            'filtered_users': {
                $filter: {
                    input: '$users',
                    as: 'user',
                    cond: {
                        $in: ['$$user.accounts', ['x']]
                    }
                }
            }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

和返回的filtered_users只有第一个用户,因为X他的账户.

但是,正如我所说,这不起作用,我得到错误:

"无效的运营商'$ in'"

因为$filter运营商不支持它.

现在我知道我可以$unwind …

mongodb mongodb-query aggregation-framework

10
推荐指数
2
解决办法
6328
查看次数

聚合 $lookup 不返回元素原始数组顺序

查询返回元素在其集合中的放置顺序,忽略初始数组的顺序。这会影响我们系统的功能。是否有任何额外的命令可以将其按正确的顺序排列?有没有可用的解决方法?

下面是一个简单的例子:

Collection1 文档

{
  "_id":ObjectId("5c781752176c512f180048e3"),
  "Name":"Pedro",
  "Classes":[
    {"ID": ObjectId("5c7af2b2f6f6e47c9060d7ce") },
    {"ID": ObjectId("5c7af2bcf6f6e47c9060d7cf") },
    {"ID": ObjectId("5c7af2aaf6f6e47c9060d7cd") }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Collection2 文件

{
  "_id":ObjectId("5c7af2aaf6f6e47c9060d7cd"),
  "variable1":"A"
},

{
  "_id": ObjectId("5c7af2b2f6f6e47c9060d7ce"),
  "variable1":"B"
},

{
  "_id": ObjectId("5c7af2bcf6f6e47c9060d7cf"),
  "variable1":"C"
}
Run Code Online (Sandbox Code Playgroud)

查询:

aggregate(
  pipeline = '[
  {"$match": {"_id": {"$oid": "5c781752176c512f180048e3"}}},
  {"$lookup": {"from": "collection2", "localField": "Classes.ID", "foreignField": "_id", "as": "Collection2_doc"}}
  ]'
)
Run Code Online (Sandbox Code Playgroud)

返回:

结果顺序:

[
    {
      "_id":ObjectId("5c7af2aaf6f6e47c9060d7cd"),
      "variable1":"A"
    },
    {
      "_id": ObjectId("5c7af2b2f6f6e47c9060d7ce"),
      "variable1":"B"
    },
    {
      "_id": ObjectId("5c7af2bcf6f6e47c9060d7cf"),
      "variable1":"C"
    }
]
Run Code Online (Sandbox Code Playgroud)

预期顺序(第一个文档数组顺序):

[
    {
      "_id": ObjectId("5c7af2b2f6f6e47c9060d7ce"),
      "variable1":"B"
    }, …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

10
推荐指数
1
解决办法
2509
查看次数

在$ group中的mongodb聚合框架中使用$ regex

请考虑以下示例:

db.article.aggregate(
  { $group : {
      _id : "$author",
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor : { $sum : "$pageViews" }
  }}
);
Run Code Online (Sandbox Code Playgroud)

这个由作者字段分组并计算两个字段.

我有$ author = FirstName_LastName的值.现在不是按$ author分组,而是希望由共享相同LastName的所有作者进行分组.

我试过$ regex在'_'后按所有匹配的字符串分组

$author.match(/_[a-zA-Z0-9]+$/)

db.article.aggregate(
  { $group : {
      _id : "$author".match(/_[a-zA-Z0-9]+$/),
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor : { $sum : "$pageViews" }
  }}
);

also tried the following:

 db.article.aggregate(
  { $group : {
      _id : {$author: {$regex: /_[a-zA-Z0-9]+$/}},
      docsPerAuthor : { $sum : 1 },
      viewsPerAuthor …
Run Code Online (Sandbox Code Playgroud)

regex mongodb aggregation-framework

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

MongoDB:聚合框架:获取每个分组ID的最新日期文档

我想获得每个电台的最后一个文件以及所有其他字段:

{
        "_id" : ObjectId("535f5d074f075c37fff4cc74"),
        "station" : "OR",
        "t" : 86,
        "dt" : ISODate("2014-04-29T08:02:57.165Z")
}
{
        "_id" : ObjectId("535f5d114f075c37fff4cc75"),
        "station" : "OR",
        "t" : 82,
        "dt" : ISODate("2014-04-29T08:02:57.165Z")
}
{
        "_id" : ObjectId("535f5d364f075c37fff4cc76"),
        "station" : "WA",
        "t" : 79,
        "dt" : ISODate("2014-04-29T08:02:57.165Z")
}
Run Code Online (Sandbox Code Playgroud)

我需要为每站最新的dt设备和站点.使用聚合框架:

db.temperature.aggregate([{$sort:{"dt":1}},{$group:{"_id":"$station", result:{$last:"$dt"}, t:{$last:"$t"}}}])
Run Code Online (Sandbox Code Playgroud)

回报

{
        "result" : [
                {
                        "_id" : "WA",
                        "result" : ISODate("2014-04-29T08:02:57.165Z"),
                        "t" : 79
                },
                {
                        "_id" : "OR",
                        "result" : ISODate("2014-04-29T08:02:57.165Z"),
                        "t" : 82
                }
        ],
        "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

这是最有效的方法吗? …

mongodb aggregation-framework

9
推荐指数
1
解决办法
7034
查看次数

mongodb聚合过滤器,用于具有大于或等于数字的字段的记录

我有一个四阶段聚合查询,形式为匹配 - >组 - >项目 - >排序.聚合工作正常并生成如下所示的数组.

    { count: 48, ISP: 'LEASEWEB USA', percentRisky: 100 },
    { count: 51, ISP: 'ARETI INTERNET LTD', percentRisky: 100 },
    { count: 82, ISP: 'TINET SPA', percentRisky: 100 },
    { count: 109, ISP: 'GIGLINX', percentRisky: 100 },
    { count: 142, ISP: 'EGIHOSTING', percentRisky: 100 },
    { count: 857, ISP: 'VERSAWEB, LLC', percentRisky: 100 }
Run Code Online (Sandbox Code Playgroud)

下面是我的聚合查询.有没有办法让我只显示'count'字段大于500的结果?我试过加入项目阶段没有运气.

        { $match : { //match to documents which are from all clients, from last three days, and scored
            org …
Run Code Online (Sandbox Code Playgroud)

mongodb node.js aggregation-framework

9
推荐指数
1
解决办法
6552
查看次数

Mongo聚合在数组元素上

我有一个类似的mongo文件

{ "_id" : 12, "location" : [ "Kannur","Hyderabad","Chennai","Bengaluru"] }
{ "_id" : 13, "location" : [ "Hyderabad","Chennai","Mysore","Ballary"] }
Run Code Online (Sandbox Code Playgroud)

从这里我如何获得位置聚合(不同的区域计数).就像是

Hyderabad 2, 
Kannur 1, 
Chennai 2, 
Bengaluru 1, 
Mysore 1, 
Ballary 1
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

9
推荐指数
1
解决办法
6797
查看次数

Mongodb递归查询

我的taxon集合中有以下架构:

{ 
  "_id": 1, 
  "na": [ "root_1",
        "root_2",
        "root_3" ], 
  "pa": 1 
},{
  "_id": 2, 
  "na": [ "name_1", 
        "name_2", 
        "name_3"], 
  "pa": 1
},{
  "_id": 4, 
  "na": [ "otherName_1", 
        "otherName_2", 
        "otherName_3"],
  "pa": 2
}
Run Code Online (Sandbox Code Playgroud)

每个文档都由父字段与另一个文档相关联,该字段对应于_id其父项.

我想执行递归搜索以获得以下结果:

{ "_id": 4, 
  "nameList": [ "otherName_1",
              "name_1",
              "root_1"]
} 
Run Code Online (Sandbox Code Playgroud)

从某个文件中_id获取na每个父项的数组的第一项,直到_id: 1达到 文档为止

我目前通过执行X查询得到这个结果(一个通过父文档,例如这里有3个),但我很确定这可以使用单个查询来实现.我已经看过新的$ graphLookup操作符了,但无法用它来解决问题...

是否可以使用MongoDB 3.4.1在单个查询中实现此目的?

编辑

我每次都会运行50个文档,因此最佳解决方案是将所有内容组合在一个查询中

例如,它看起来像

var listId = [ 4, 128, 553, 2728, ...];
var cursor = db.taxon.aggregate([
  {$match: …
Run Code Online (Sandbox Code Playgroud)

recursion mongodb aggregation-framework

9
推荐指数
1
解决办法
4981
查看次数

使用管道和使用let变量的geoIntersects查找

我正在尝试查找符合我条件的邻域 - boundries多边形与帖子的坐标相交但我无法做到 - 无法使用let我的pipeline $match

邮政实体的例子:

{
  _id: ObjectId,
  ...,
  location: {
    ...,
    coordinates: {
      type: 'Point',
      coordinates: [number, number]
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

邻域实体的例子:

{
  _id: ObjectId,
  ...,
  boundries: {
    type: 'Polygon',
    coordinates: [ [ [number, number], [number, number], [number, number], [number, number], [number, number] ] ]
  }
};
Run Code Online (Sandbox Code Playgroud)

查询示例我试图"修复":

db.posts.aggregate([
  { $match: { _id: ObjectId('5a562e62100338001218dffa') } },
  {
    $lookup: {
      from: 'neighborhoods',
      let: { postCoordinates: '$location.coordinates.coordinates' },
      pipeline: [
        {
          $match: {
            boundries: { …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

9
推荐指数
1
解决办法
349
查看次数