MongoDB聚合:将两个数组配对生成对象数组的问题求助
解决MongoDB数组配对转换的问题
你的需求是把文档中两个平行数组userhasRate和ratings按索引对应,合并成一个包含对象的rate数组,同时保留原文档的其他字段对吧?之前用$group的思路不太对,因为$group是用于跨文档分组聚合的,而你需要的是单文档内的数组映射处理。
正确的聚合查询
可以用$zip和$map组合来实现这个需求,具体的聚合管道如下:
db.getCollection('contens').aggregate([ { $project: { contributor: 1, title: 1, rate: { $map: { input: { $zip: { inputs: ["$userhasRate", "$ratings"], useLongestLength: false // 确保两个数组长度一致时才配对,可根据需求调整 } }, as: "pair", in: { userhasrate: { $arrayElemAt: ["$$pair", 0] }, value: { $arrayElemAt: ["$$pair", 1] } } } } } } ])
步骤解释
- $zip:将
userhasRate和ratings两个数组按索引位置配对,生成类似[["51",4], ["52",3]]的二维数组。useLongestLength设为false时,只有当两个数组长度完全匹配才会生成配对,避免出现空值。 - $map:遍历
$zip生成的二维数组,将每个子数组转换成你需要的对象结构:用$arrayElemAt取出子数组的第一个元素作为userhasrate,第二个作为value。 - $project:保留原文档的
_id(默认保留)、contributor、title字段,同时将处理后的数组命名为rate。
执行结果
运行上述查询后,你会得到期望的文档结构:
{ "_id" : ObjectId("5cf12696e81744d2dfc0000c"), "contributor": "user1", "title": "Title 1", "rate" : [ { "userhasrate": "51", "value": 4 }, { "userhasrate": "52", "value": 3 } ] }
内容的提问来源于stack exchange,提问作者WimpyKatana
相关产品推荐
相关产品推荐

