【问题标题】:Nested cursors with mongodb driver in phoenix/elixir在 phoenix/elixir 中使用 mongodb 驱动程序嵌套游标
【发布时间】:2020-02-07 01:52:58
【问题描述】:

我正在使用来自 https://github.com/ankhers/mongodb 的 mongodb 驱动程序来查询 elixir/phoenix 项目中的 mongodb 数据库。在另一个问题中,我询问了如何查询嵌套的 jsons。另一个问题是如何查询插入的文档。例如,我可以在 python 中执行以下操作

date_=db['posts']['name'][name]['date'][date]

这里,'posts' 是集合的名称,其他是插入的文档。例如,通过以下方式插入了一个“日期”文档:

  db['posts']['name'][name].insert_one({"date":date})

当我想在python中获取所有插入的日期时,我可以这样做

date_list=[]
def get_date(db):
  db_posts_name=db['posts']['name'][name]
  for date_query in db_posts_name.find():
        date_list.append(date_query["date"])  

但我在长生不老药/凤凰做同样的事情时不知所措,因为如果我做类似的事情

      list =
        :mongo
        |> Mongo.find("posts", %{})
        |> Enum.fetch(4)
        |> elem(1) 
        |> Map.fetch("name")
        |> elem(1)
      new_list =
        :mongo
        |> Mongo.find("posts", %{"name" => list})
      another_list=new_list.find("date",%{})

我得到错误

Called with 3 arguments

%Mongo.Cursor{coll: "posts", conn: #PID<0.434.0>, opts: [slave_ok: true], query: %{"name" => name}, select: nil}
:find
[]

有没有办法做到这一点?

【问题讨论】:

  • 您能分享一下最小的可行数据吗?您希望得到什么结果?当前的代码问题是new_list.find 表示法(elixir 中没有 no 对象,不能在任何东西上使用点表示法,应该从模块调用函数,将术语作为参数传递。)
  • 感谢您的回答。我在想new_list.find()是一个对光标的函数调用,就像上面的python代码一样。

标签: mongodb elixir phoenix-framework


【解决方案1】:

Mongo.find 总是返回一个游标。游标就像一个流式 API,所以你必须 调用诸如Enum.take()Enum.to_list 之类的函数。如果您处理很长的集合 改用Stream 模块是个好主意。

如果你想获取一个文档,那么你可以使用Mongo.find_one

我不理解你的例子。我假设name 是一个参数:

  date_list=[]
  def get_date(db):
    db_posts_name=db['posts']['name'][name]
    for date_query in db_posts_name.find():
          date_list.append(date_query["date"])  

以下代码在集合posts 中获取name 等于参数name 的所有文档,并仅返回date 字段:

    date_list = :mongo
      |> Mongo.find("posts", %{"name" => name}, %{"date" => 1})    
      |> Enum.map(fn %{"date" => date} -> date end)

顺便你可以试试elixir-mongodb-driver。此实现同时支持批量 api、更改流 api 和事务 api。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多