Я использую mongodb_ecto, и я хочу знать, как я могу выполнять операции типа $ push или $ pull на глубоко вложенном поле? В настоящий момент я пишу весь документ, который иногда вызывает ложные данные в БД из-за состояния гонки.
0
A
ответ
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}}
)