MongoDB嵌套数组中提取指定元素使用$运算符报错如何解决?
错误原因说明
你使用的$位置运算符仅适用于匹配查询条件中过滤出的第一个符合要求的数组成员,你的查询语句没有对darwin数组设置任何过滤条件,因此$运算符无法找到匹配项,触发报错。同时$运算符仅能返回单个数组成员,无法批量处理数组内的所有元素,也不支持修改数组成员的返回结构,不满足你的需求。
正确查询实现
你需要使用MongoDB聚合查询实现需求,通过$map遍历darwin数组,结合$arrayElemAt提取每个d数组的首个元素:
原生MongoDB查询语句
db.getCollection('data').aggregate([ // 匹配date为0的目标文档 { $match: { date: 0 } }, // 构造返回结构 { $project: { date: 1, darwin: { $map: { input: "$darwin", as: "darwinItem", in: { d: { $arrayElemAt: [ "$$darwinItem.d", 0 ] } } } } } } ])
Mongoose中调用示例
const Data = require('./你的schema文件路径'); // 异步调用方式 const result = await Data.aggregate([ { $match: { date: 0 } }, { $project: { date: 1, darwin: { $map: { input: "$darwin", as: "darwinItem", in: { d: { $arrayElemAt: [ "$$darwinItem.d", 0 ] } } } } } } ])
可选优化
如果存在d数组为空的场景,可以搭配$ifNull设置默认值,避免返回null:
d: { $ifNull: [ { $arrayElemAt: [ "$$darwinItem.d", 0 ] }, "" ] }
内容的提问来源于stack exchange,提问作者Paul Barrios
相关产品推荐
相关产品推荐

