目前,在聚合管道的$project
操作中,$slice
运算符不可用.
首先是$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}})
Update:根据您的 comments ,假设您只想要数组中的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];
})
Select 上述选项取决于您的数据大小和应用程序设计.