RethinkDB迁移MongoDB时如何按引用user_id的state动态键名过滤文档
MongoDB 等效RethinkDB过滤逻辑的实现方案
不需要强制使用$objectToArray,根据你使用的MongoDB版本有更简便的实现方式:
方案1:MongoDB 5.0及以上版本(推荐)
可以使用$getField动态获取字段值,写法更简洁,性能也优于对象转数组的方案:
db.collection.aggregate([ { $match: { $expr: { $eq: [ { $ifNull: [ { $getField: { input: "$state", field: "$user_id" } }, 0 ] }, 1 ] } } }, { $limit: 5 } ])
该写法逻辑和原RethinkDB逻辑完全对齐:
- 动态读取
state对象下、键等于当前文档user_id的字段值 - 字段不存在时用
$ifNull设置默认值0 - 过滤出值等于1的文档,最多返回5条
方案2:MongoDB 4.4及以下版本
如果你的MongoDB版本不支持$getField,才需要用到$objectToArray转换实现:
db.collection.aggregate([ { $match: { $expr: { $eq: [ { $ifNull: [ { $first: { $map: { input: { $filter: { input: { $objectToArray: "$state" }, cond: { $eq: [ "$$this.k", "$user_id" ] } } }, in: "$$this.v" } } }, 0 ] }, 1 ] } } }, { $limit: 5 } ])
内容的提问来源于stack exchange,提问作者Denis Cheremisov
相关产品推荐
相关产品推荐

