You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:06:07