Arrays 在数组中的数组上使用MongoDB$slice运算符

Arrays 在数组中的数组上使用MongoDB$slice运算符,arrays,mongodb,mongodb-query,slice,Arrays,Mongodb,Mongodb Query,Slice,我有一个如下所示的模式: > db.test.findOne() { "_id" : "1:1419552000", "l0" : [ { "l1" : [ "1", "2", "3", "4" ] }, { "l1" : [

我有一个如下所示的模式:

> db.test.findOne() { "_id" : "1:1419552000", "l0" : [ { "l1" : [ "1", "2", "3", "4" ] }, { "l1" : [ "11", "12", "13", "14" ] }, { "l1" : [ "21", "22", "23", "24" ] }, { "l1" : [ "31", "32", "33", "34" ] }, { "l1" : [ "41", "42", "43", "44" ] } ] } >db.test.findOne() { “_id”:“1:1419552000”, “l0”:[ { “l1”:[ "1", "2", "3", "4" ] }, { “l1”:[ "11", "12", "13", "14" ] }, { “l1”:[ "21", "22", "23", "24" ] }, { “l1”:[ "31", "32", "33", "34" ] }, { “l1”:[ "41", "42", "43", "44" ] } ] } 我希望能够从级别1(l1)的任何数组中获取一系列元素。但是$slice操作符不能做到这一点。这根本不可能吗

> db.test.findOne({}, {"l0" : {$slice: 1}}) { "_id" : "1:1419552000", "l0" : [ { "l1" : [ "1", "2", "3", "4" ] } ] } > db.test.findOne({}, {"l0.0.l1" : {$slice: 2}}) { "_id" : "1:1419552000", "l0" : [ ... returns the entire object ... } >findOne({},{“l0”:{$slice:1}) { “_id”:“1:1419552000”, “l0”:[ { “l1”:[ "1", "2", "3", "4" ] } ] } >findOne({},{“l0.0.l1”:{$slice:2}) { “_id”:“1:1419552000”, “l0”:[ ... 返回整个对象 ... }
欢迎提供任何指针或帮助。谢谢!

对于您提供的示例文档,
db.test.findOne({},{l0.l1:{$slice:2})
返回

{
    "_id" : "1:1419552000",
    "l0" : [
        {
            "l1" : [
                "1",
                "2"
            ]
        },
        {
            "l1" : [
                "11",
                "12"
            ]
        }, ...

您没有在问题中指定所需的输出。假设您只想返回满足特定范围标准(例如>41)的
l1
元素,您可以使用
$unwind
参数和
aggregate
函数:

 db.test.aggregate({
    $unwind: "$l0"
}, {
    $unwind: "$l0.l1"
}, {
    $match: {
        "l0.l1": {
            $gt: "41"
        }
    }
}, {
    "$group": {
        "_id": "$_id",
        "l1": {
            "$addToSet": "$l0.l1"
        }
    }
})
这将返回:

{
   "_id": "1:1419552000",
    "l1": ["43", "44", "42"]
}

如果您将所需的输出添加到问题中,我可以修改查询以返回正确的输出。

您可以使用聚合框架,并获得所需的子阵列范围:

db.test.aggregate(
{
$match:{u id:“1:1419552000”}
},
{
$unwind:$l0
},
{
$limit:1//保留l0中的第一个元素
},
{
$unwind:$l0.l1
},
{
$limit:2//将前两个元素保留在第一个l1中
},
{
$group://将展开的元素重新分组到数组中
{
_id:“$\u id”,
l0:{$addToSet:$l0.l1}
}
}
)
这将返回:

{u id:“1:1419552000”,“l0:[“2”,“1”]}

您期望的输出是什么?对不起,我应该提到,对于我不正确的查询:
db.test.findOne({},{l0.0.l1:{$slice:2}})
它应该是:
{u id:“1:1419552000”,“l0:[“2”,“1”]}
或类似感谢您的回复,这不是我的想法。我刚刚用注释中的预期输出更新了问题。感谢您的回复!很抱歉没有在问题中添加预期输出。现在将其添加为注释。接受另一个答案,因为它,IMO,可以更好地解释问题。再次感谢。