CosmosDb按属性和聚合过滤数组

时间:2018-01-22 14:16:17

标签: mongodb mongodb-query azure-cosmosdb

鉴于以下文件结构:

{
  _id: ObjectId("..."),
  lists: [
    {
      name: 'List 1'
      meta: {
        expiresOn: 1621560318226
      }
    },
    {
      name: 'List 2'
      meta: {
        expiresOn: 1418971859555
      }
    }
  ]
}

我试图获得属性expiresOn大于某个时间戳的所有列表的聚合,但这似乎比我想象的要难。所以预期的结果是:

[
 { name: 'List 1' }
 { name: 'List from another document' }
]

我尝试的是以下内容:

db.someCollection.aggregate([ 
  {
    $project: {
      lists: {
        $filter: {
          input: "$lists",
          as: "list",
          cond: { $gte: [ "$$list.meta.expiresOn", 1516620762985 ] }
        }
      }
    }
  },
  { $unwind :'$lists'},
  { 
    $project : { 
      _id:0, 
      name: '$lists.name',
    } 
  }
])

在CosmosDb的Mongo Shell中运行时,我得到ERROR: Command aggregate failed: Unknown server error occurred when processing this request..

我试图将聚合分成几部分并单独运行,除了第一部分外,它们似乎都有效。

我做错了什么?

LE:尝试了另一种方法,类似于之前的方法,但这一方法返回空白:

db.clients.aggregate([
  { $unwind: '$lists'},
  { 
    $match: {
      'lists.meta.expiresOn': { $gt: 1516620762985 }
    }
  },
  { 
    $project : { 
      _id:0, 
      name: '$lists.name',
    } 
  }
])

并且旁注......这样的聚合表现得如何?我是否提到我是这个领域的初学者? :)

谢谢!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我在cosmosdb上有一个3.6版本的mongo实例和另一个3.2版本的实例,第一个可以正常工作,但第二个则不能。

两个本地版本(没有cosmosdb)都可以正常工作。