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

时间:2016-12-08 09:54:30

标签: javascript python mongodb pymongo

给出类似下面的时间序列文件

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

    otherFieldA: {...}
    otherFieldB: {...}
}

要获得2015切片,我会使用以下预测here

myProjection = {'data':0, 'otherFieldA':0, 'otherFieldB':0, 'data.2015':{'$slice': [3, 5]}}

db.collection.find({}, myProjection)

现在让我们假设我想要得到2016全部

  • 选项A :在上面的投影中添加'data.2016':1会产生经典的inclusion + exclusion mongo错误

  • 选项B :向投影$slice添加另一个'data.2016':{'$slice': <len of data.2016>},但可能效率低,因为mongo需要向下滚动data.2016数组而不只是挖出整个阵列。另外,我需要知道data.2016的长度,这不是给定的

是否有第三个选项可以获得data.2015data.2016的所有内容,同时排除所有otherField值?

1 个答案:

答案 0 :(得分:1)

您可以使用$ 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"
      ]
   }
}