How can I get and return the first element in an array using a Mongo aggregation?

我试着使用以下代码:

db.my_collection.aggregate([
    { $project: {
        resp : { my_field: { $slice: 1 } }
    }}
])

但我得到了以下错误:

uncaught exception: aggregate failed: {
    "errmsg" : "exception: invalid operator '$slice'",
    "code" : 15999,
    "ok" : 0
}

注意,'my_field'是一个由4个元素组成的数组,我只需要返回第一个元素.

推荐答案

目前,在聚合管道的$project操作中,$slice运算符不可用.

首先是$unwindmy_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数组中的第二项,即_idid.

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 上述选项取决于您的数据大小和应用程序设计.

Mongodb相关问答推荐

在MongoDB Aggregate for My BooksDB中将`$match`放在`$unwin`之前或之后的区别

MongoDB 在一个聚合中包含多个组

lexik_jwt_authentication下无法识别的选项api_platform

MongoDB 聚合使用 $match 和 $expr 和数组

在MongoDb的数组中计算大于某个数字的数字

MongoDB乘以对象值?

没有mongoose 的 Express 和 MongoDB

MongoDB 到 Snowflake 连续加载

mongodb:多键索引 struct ?

Node.js 数据库的抽象层

Mongo 可尾游标与 Redis 发布/订阅

使用 ObjectId.GenerateNewId() 还是离开 MongoDB 创建一个?

Springboot 使用 find*() 查询时出现 Mongodb 错误

使用 MongoDB 更新数组字段内的特定键/值

Express 无法 PUT/DELETE 方法.出了什么问题?

Mongoose Schema vs Mongo Validator

MongoDB 日志(log)文件和 oplog 有何不同?

MongoDB 数据库,相当于 SELECT column1, column2 FROM tbl

填充mongoose后查找

为什么 Mongo 提示会使查询运行速度提高 10 倍?