【问题标题】:db.getCollection(...).find(...).aggregate is not a functiondb.getCollection(...).find(...).aggregate 不是函数
【发布时间】:2020-09-12 21:04:11
【问题描述】:

(* MongoDB shell 版本:2.6.12 *)

我有一个集合 logs 和一个集合 userslogs 有一个字段 userId 代表发送日志的用户。 users 有一个字段 _id

我使用 Robo 3T 对远程服务器中的数据进行查询。

现在,我对url/subscribe 的日志感兴趣,我想看看后面的那些用户信息。所以我写了以下查询:

db.getCollection('logs').find({ "url" : "/subscribe" }).aggregate({
    $lookup:{
        from:"users",
        localField:"userId",
        foreignField:"_id",
        as:"logs_users"
    }
})

但我得到一个错误:

有人知道怎么解决吗?

编辑 1:我遇到了一个新错误:

【问题讨论】:

  • 服务器是什么Mongo版本? $lookup 在 Mongo 3.2 中引入
  • MongoDB shell version: 2.6.12 在服务器中。
  • 2.6.12 不支持$lookup 阶段。
  • 2.6.12没有其他替代功能了吗?
  • 我不这么认为。整个加入的概念在 Mongo 中并不自然。

标签: mongodb mongoose robo3t


【解决方案1】:

你不应该在查找后使用聚合,而是直接使用聚合并使用 $match 运算符查找文档,然后 $lookup

db.getCollection('logs').aggregate([
   {
       $match:{"url" : "/subscribe"}
   },
   {
       $lookup:{
        from:"users",
        localField:"userId",
        foreignField:"_id",
        as:"logs_users"
       }
   }
])

更新:要使用 $lookup,您的 MongoDB 版本应该等于或大于 3.2,因为此运算符(连接)在旧版本的 MongoDB 中不起作用

【讨论】:

  • 您使用的是哪个 MongoDB 版本?试试 mongod --version
  • MongoDB shell version: 2.6.12 在服务器中
  • 那么,我应该升级我的 mongodb 还是寻找 $lookup 的其他解决方法?
  • $lookup 运算符是在 MongoDB 版本 3.2 中引入的,您使用的数据库版本非常旧,是的,如果您想使用 MongoDB 查询来更新数据库版本,则可以这样做以您各自的编码语言手动加入
  • 另一种解决方法是我可以将数据复制到我的本地磁盘并查询它在哪里安装了更新的 mongodb,对吧?
猜你喜欢
  • 2018-05-23
  • 2019-02-01
  • 2023-03-05
  • 2018-10-01
  • 2019-08-04
  • 1970-01-01
  • 2019-01-18
  • 2016-08-20
  • 1970-01-01
相关资源
最近更新 更多