MongoDB集合查询:匹配senders首元素后返回截断的senders字段
MongoDB查询:匹配senders首元素后返回去掉首元素的数组
没问题,我来帮你搞定这个需求!你要的是当文档里senders数组的第一个元素和指定值匹配时,返回去掉第一个元素后的剩余数组,对吧?
这里有两种实用的方法,取决于你使用的MongoDB版本:
方法一:用$rest操作符(MongoDB 4.4+推荐)
这个操作符可以直接返回数组去掉第一个元素后的所有内容,语法非常简洁:
db.Test.aggregate([ // 先筛选出符合条件的文档,提升查询效率 { $match: { "senders.0": "zAxNarwAE2AnvLA8P" } }, // 只返回处理后的senders数组,不返回默认的_id字段 { $project: { senders: { $rest: "$senders" }, _id: 0 } } ])
代码说明:
$match阶段:先过滤掉senders第一个元素不是目标值的文档,避免对无关文档做计算。$project阶段:用$rest直接提取senders数组去掉第一个元素的部分,_id: 0是为了不返回默认的_id,如果需要保留_id可以删掉这个配置。
方法二:用$slice操作符(兼容旧版本MongoDB)
如果你的MongoDB版本低于4.4,没有$rest,可以用$slice结合$size和$subtract来实现:
db.Test.aggregate([ { $match: { "senders.0": "zAxNarwAE2AnvLA8P" } }, { $project: { senders: { $slice: [ "$senders", 1, // 从索引1的位置开始取(也就是跳过第一个元素) { $subtract: [{ $size: "$senders" }, 1] } // 取的长度是数组总长度减1 ] }, _id: 0 } } ])
代码说明:
$slice的参数分别是目标数组、起始索引、要取的长度。这里通过$size获取数组总长度,减去1后得到需要提取的元素数量,刚好跳过第一个元素。
执行结果
针对你提供的示例文档,执行上面任意一段代码后,都会返回你想要的结果:
{ "senders": [ "me3AWg85YDvWMShKY", "e3wADkdLDKp5MEKYW", "4dzdz8Xaw7aQM7ZeW" ] }
内容的提问来源于stack exchange,提问作者EyTa
相关产品推荐
相关产品推荐

