-
Type:
Task
-
Resolution: Done
-
Priority:
Major - P3
-
Affects Version/s: None
-
Component/s: None
-
None
-
None
-
None
-
None
-
None
-
None
-
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
-