【问题标题】:MongoDB - Complex $slicing with inclusions and exclusionsMongoDB - 包含和排除的复杂 $slicing
【发布时间】:2016-12-08 09:54:29
【问题描述】:

给定一个像下面这样的时间序列文档

{
    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': &lt;len of data.2016&gt;} 可行,但可能时间效率低下,因为 mongo 需要向下滚动 data.2016 数组,而不仅仅是舀起整个阵列。另外,我需要知道data.2016 的长度,这不是给定的

是否有第三种选择可以获取data.2015 的一部分和所有data.2016,同时排除所有otherField 值?

【问题讨论】:

    标签: javascript python mongodb pymongo


    【解决方案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"
          ]
       }
    }
    

    【讨论】:

    • 谢谢。与投影的普通发现相比,我应该期望什么样的性能影响? (如果有)
    • 我想没有真正的区别,但是根据您提供的信息很难判断。如果您真的关心性能,请查看两个查询的 explain() 输出,以便了解实际发生的情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2017-12-22
    • 2011-11-20
    • 2013-01-09
    相关资源
    最近更新 更多