我正在使用https://github.com/ankhers/mongodb中的mongodb驱动程序来查询elixir / phoenix项目中的mongodb数据库。在另一个问题中,我询问了如何查询嵌套的json。另一个问题是如何查询插入的文档。例如,我可以在python
中执行以下操作date_=db['posts']['name'][name]['date'][date]
在这里,“帖子”是集合的名称,其他是插入的文档。例如,通过以下方式插入了一个“日期”文档:
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()
或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} end)
通过这种方式,您可以尝试elixir-mongodb-driver。此实现支持批量api,更改流api和事务api。