您需要使用聚合管道来实现$slice
链,由于项目语句作为查找查询的一部分的限制。
以下查询无效,因为第一个$slice
将返回一个数组,而不是索引,并执行外部作用域$slice
fails.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
此外,无法在同一个项目声明中处理投影字段,如果可能的话,我们可以通过对其应用 $slice 来进一步修改文本。
要走的路是:
-
Match
名称为 foo 的记录。
-
Unwind
到达第一层的文本数组。
-
Unwind
再次达到我们想要的水平。
-
Group
按名称记录在一起。
-
Project
组中的最后一条记录,也是最后一个元素
最后一个嵌套数组的。
代码:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
或者如果您想投影以特定顺序出现的元素,那么您可以使用$skip
and $limit
操作来实现这一点。
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
它按顺序投影嵌套数组中的第二个元素。