MongoDB技术问题:如何将$sample结果存入新增的seeAlso字段
解决方案
你可以通过聚合管道组合$match、$addFields和$lookup(配合内部的$sample)来实现需求,核心思路是先定位目标文档,再将同集合的随机样本数据注入到新增的seeAlso字段中,同时排除当前文档避免重复:
完整聚合管道示例
假设你的集合名为yourCollection,目标文档的_id为targetId,管道代码如下:
db.yourCollection.aggregate([ // 匹配目标单条记录 { $match: { _id: ObjectId("targetId") } // 替换为你的目标ID }, // 新增seeAlso字段并填充随机样本 { $addFields: { seeAlso: { $lookup: { from: "yourCollection", // 指定同集合名称 pipeline: [ // 排除当前文档,避免样本包含自身 { $match: { _id: { $ne: "$_id" } } }, // 随机抽取3条样本数据 { $sample: { size: 3 } } ], as: "seeAlso" } } } } ])
关键逻辑说明
$match阶段精准定位你需要的目标文档,确保后续操作只针对这条记录。$addFields用于给目标文档新增seeAlso字段,字段值由$lookup的返回结果填充。$lookup的内部管道先通过$ne条件排除当前文档的_id,再用$sample抽取3条随机记录,最终将结果以数组形式存入seeAlso。
执行后返回的文档格式会符合你的要求:
{ "_id": ObjectId("targetId"), "key1": "value1", "key2": "value2", "seeAlso": [ { /* 随机样本文档1 */ }, { /* 随机样本文档2 */ }, { /* 随机样本文档3 */ } ] }
内容的提问来源于stack exchange,提问作者Pedro Rabbi
相关产品推荐
相关产品推荐

