给定的时间表文档,如下
{
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"
]
}
}