2016-12-01 6 views
0

Я использую mongodb_ecto, и я хочу знать, как я могу выполнять операции типа $ push или $ pull на глубоко вложенном поле? В настоящий момент я пишу весь документ, который иногда вызывает ложные данные в БД из-за состояния гонки.

ответ

0

Хорошо, я как-то понял. Не используйте Ecto для этого. В некоторых случаях вам нужен MongoDB positional operator, и это можно сделать только через Mongo-Adapter. Теперь для некоторых примеров использования:

У меня есть уборка со списком опций. Параметры имеют идентификатор, метку и список идентификаторов пользователей, которые проголосовали за эту опцию.

BTW для создания ObjectID (который необходим для общения непосредственно к MongoDB-адаптер) используйте:

id = "584a5b9419d51d724d146e3f" # string form 
value = (for <<hex::16 <- id>>, into: <<>>, do: <<String.to_integer(<<hex::16>>, 16)::8>>) 
object_id = %BSON.ObjectId{value: value} 

А теперь несколько примеров:

# update label of option 
Mongo.update_one(Repo.Pool, "polls", 
    %{"_id" => document_id, "options.id" => option_id}, # query 
    %{"$set" => %{"data.options.$.label" => new_label}} # update 
) 

# add new option to poll 
Mongo.update_one(Repo.Pool, "polls", 
    %{"_id" => document_id}, 
    %{"$addToSet" => %{"options" => %{label: label, id: random_new_id, votes: []}}} 
) 

# add user_id to option 
Mongo.update_one(Repo.Pool, "polls", 
    %{"_id" => document_id, "options.id" => option_id}, 
    %{"$addToSet" => %{"options.$.votes" => user_id}} 
) 

# remove user_id form option 
Mongo.update_one(Repo.Pool, "polls", 
    %{"_id" => document_id, "options.id" => option_id}, 
    %{"$pull" => %{"data.options.$.votes" => user_id}} 
) 

 Смежные вопросы

  • Нет связанных вопросов^_^