Arrays 在数组中的数组上使用MongoDB$slice运算符
我有一个如下所示的模式: > 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”:[ ... 返回整个对象 ... }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({},{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,可以更好地解释问题。再次感谢。