目前,$slice 运算符在聚合管道的 $project 操作中不可用。
所以你可以做的是,
首先$unwind,my_field 数组,然后将它们组合在一起并取组的$first 元素。
db.my_collection.aggregate([
{$unwind:"$my_field"},
{$group:{"_id":"$_id","resp":{$first:"$my_field"}}},
{$project:{"_id":0,"resp":1}}
])
或者使用find() 命令,您可以在projection 部分使用$slice 运算符。
db.my_collection.find({},{"my_field":{$slice:1}})
更新:根据您的 cmets,假设您只需要数组中的 second 项,用于 ID 为 id 的记录。
var field = 2;
var id = ObjectId("...");
然后,下面的聚合命令会为您提供 my_field 记录数组中的第二项,即 _id、id。
db.my_collection.aggregate([
{$match:{"_id":id}},
{$unwind:"$my_field"},
{$skip:field-1},
{$limit:1}
])
上面的逻辑不能应用于更多的记录,因为它会在$unwind之后涉及$group,运算符。 $group 运算符为该特定组中的所有记录生成单个记录,从而使在后期应用的 $limit 或 $skip 运算符无效。
上面的find() 查询的一个小变化也会产生预期的结果。
db.my_collection.find({},{"my_field":{$slice:[field-1,1]}})
除此之外,总有办法在客户端做到这一点,但如果记录数量很大,成本会有点高:
var field = 2;
db.my_collection.find().map(function(doc){
return doc.my_field[field-1];
})
从上述选项中进行选择取决于您的数据大小和应用设计。