MongoDB-复杂的$切片,包含和排除



给定的时间表文档,如下

{
    data:{
        '2015':['a', 'b', 'c', ...],     //<array of n datapoints>
        '2016':['d', 'e', 'f', ...],     //<array of n datapoints>
    },
    otherFieldA: {...}
    otherFieldB: {...}
}

要获得2015切片,我将使用以下以下投影:

myProjection = {'data':0, 'otherFieldA':0, 'otherFieldB':0, 'data.2015':{'$slice': [3, 5]}}
db.collection.find({}, myProjection)

现在让我们假设i 也想获得 2016

的所有
  • 选项a :在上面的投影中添加'data.2016':1获得经典包含 排除mongo错误

  • 选项b :将另一个$slice添加到投影'data.2016':{'$slice': <len of data.2016>}的作用,但可能会效率低下,因为Mongo需要向下滚动data.2016数组,而不仅仅是scoop scoop of整个数组。另外,我需要知道data.2016的Lenght,这不是给定的

是否有第三个选项可以获取data.2015和所有data.2016的切片,同时排除了所有otherField值?

您可以使用$ project:

使用聚合框架来执行此操作。
db.collection.aggregate([
   {
      $project:{
         "data.2015":{
            $slice:[
               "$data.2015",
               1,
               1
            ]
         },
         "data.2016":"$data.2016"
      }
   }
])

输出将是:

{
   "_id":ObjectId("58492f23f2e6a23e2168649d"),
   "data":{
      "2015":[
         "b"
      ],
      "2016":[
         "d",
         "e",
         "f"
      ]
   }
}

最新更新