0
私はmongodb_ectoを使用しています。深く入れ子になったフィールドで$ pushや$ pullのような操作をどのように行うことができますか?現時点では、競合状態により誤ったデータがDBに存在することがある文書全体を書き戻しています。
私はmongodb_ectoを使用しています。深く入れ子になったフィールドで$ pushや$ pullのような操作をどのように行うことができますか?現時点では、競合状態により誤ったデータがDBに存在することがある文書全体を書き戻しています。
わかりました。このためにEctoを使用しないでください。場合によってはMongoDB positional operatorが必要です。これはMongo-Adapter経由で直接行うことができます。いくつかの使用例を次に示します:
私はオプションのリストを持っています。オプションには、ID、ラベル、およびこのオプションに投票したユーザーIDのリストがあります。
ところで(MongoDBは、アダプタに直接話をするために必要とされている)のObjectIDを生成するためにこれを使用する:
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}}
)