-
Type: Task
-
Resolution: Done
-
Priority: Major - P3
-
Affects Version/s: None
-
Component/s: None
-
None
We have
class User include Mongoid::Document # some fields embeds_many :conversations accepts_nested_attribute_for :conversations end class Conversation include Mongoid::Document # some fields embedded_in :user embeds_many :messages accepts_nested_attribute_for :messages end class Message include Mongoid::Document field :message, type: String # some fields embedded_in :conversation end
Now we create a user that has 2 conversations each with 2 messages
u = User.create! c1 = u.conversations.create! c1.messages.create!(message: "one") c1.messages.create!(message: "two") c2 = u.conversations.create! c2.messages.create!(message: "three") c2.messages.create!(message: "four")
Then, we need to change the message "two" with "six",
u = User.last c1 = u.conversations.first m2 = c1.messages.last m2.message = "six" m2.save! m2.valid? # => true
After all of this, why is it that it is not message "two" that is updated to "six", instead, it is "one" that now becomes "six" and "two" remains as "two"
I noticed that the update part of the code produces this following Moped update query :
selector={"_id"=>BSON::ObjectId('539e4ec04db79b997d00000c'), "conversations._id"=>BSON::ObjectId('539e6c254db79b84ab00000d'), "conversatoins.0.messages._id"=>BSON::ObjectId('539fac734db79b1e4100000f')} update={"$set"=>{"conversations.0.messages.$.message"=>"six"}}
I have tried to translate this MOPED syntax to javascript and tested it in mongo shell, that produced the same behavior. Then I realized that in MongoDB, positional operator "$" cannot be used to locate inner array.
The question is, if Core MongoDB does not serve locating inner array element index using "$" (positional operator), why does Mongoid produce this query on nested embeds_many (nested MongoDB arrays)? Why not just makes a class that has embeds_many and embedded_in at the same time as invalid?
Note: To test this I used Mongoid 4.0.0 rc1 and for the mongo shell, the version is 2.6.2
- duplicates
-
MONGOID-3858 updates to embedded lists no longer work correctly
- Closed