Вложенные курсоры с драйвером mongodb в фениксе / эликсире - PullRequest
0 голосов
/ 07 февраля 2020

Я использую драйвер mongodb из https://github.com/ankhers/mongodb для запроса базы данных 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
[]

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 24 марта 2020

Mongo.find всегда возвращает курсор. Курсор похож на потоковый API, поэтому вам нужно вызвать некоторую функцию, например Enum.take() или Enum.to_list. Если вы обрабатываете очень длинные коллекции, лучше использовать модуль Stream.

Если вы хотите получить один документ, вы можете использовать Mongo.find_one.

I ' Я не понимаю ваш пример. Я предполагаю, что 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 транзакций.

...