2016-12-01 68 views
0

我正在使用mongodb_ecto,我想知道如何在深度嵌套字段上執行$ push或$ pull操作?目前我寫回整個文檔,有時會由於競爭條件導致數據庫中存在錯誤數據。

回答

0

好吧,我有點想通了。不要爲此使用Ecto。在某些情況下,您需要MongoDB positional operator,這隻能通過Mongo適配器直接完成。現在爲一些使用示例:

我有一個選項列表doucment。選項有投票支持該選項的ID,標籤和用戶標識列表。

順便說一句,以生成的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}} 
) 
相關問題