mongodb - 在 phoenix/elixir 中使用 mongodb 驱动程序嵌套游标
问题描述
我正在使用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
[]
有没有办法做到这一点 ?
解决方案
Mongo.find
总是返回一个游标。游标就像一个流 api,所以你必须调用一些函数,比如Enum.take()
or 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。
推荐阅读
- reactjs - React Navigation 5 - 深度链接不接受给定路径并按预期解析状态
- swift - 我正在使用 Mac os 10.14 Mojave,我无法在我的项目中安装任何 pod 文件
- flutter - 如何在飞镖中获得小数部分
- spring - 将属性传递给 spring 云数据流的组合任务运行器应用程序的子任务
- html - Django,主页总是显示在子页面上
- javascript - jscodeshift TypeScript codemod - 删除通用类型但保留包装类型
- python - 如何在`Flask`中的`g`上键入提示属性?
- gridview - 具有查找编辑数据源刷新的 Devexpress 网格
- ide - .editorconfig JetBrains 值与空格
- html - 必需属性在输入标签中不起作用