Uploaded image for project: 'Mongoid'
  1. Mongoid
  2. MONGOID-3262

Bug with $addToSet on has_and_belongs_to_many foreign keys field

    XMLWordPrintable

    Details

    • Type: Task
    • Status: Closed
    • Resolution: Done
    • Affects Version/s: None
    • Fix Version/s: 4.0.0 final
    • Component/s: None
    • Labels:

      Description

      I've ran into an odd bug related to $addToSet on has_and_belongs_to_many model_ids field. When I try to add an id to the field using {{Model.update "$addToSet" =>

      {model_ids: id}

      }} Mongoid inserts [id] - a single element array instead of just id. This also happens with update_all, but not with add_to_set :model_ids, id call. It does not happen when the field is simply defined as an Array type instead of many-to-many relation (field :model_ids, type: Array). Here's a short test script.

      #!/usr/bin/env ruby
       
      require 'mongoid'
       
      Mongoid.configure do |config|
        config.connect_to "mongoid_test"
      end
       
      Moped.logger = Logger.new(STDOUT)
       
      class Tag
        include Mongoid::Document
      end
       
      class A
        include Mongoid::Document
      end
       
      def test_add_to_set value
        @a ||= A.create
       
        puts "\n\n"
       
        A.where(_id: @a.id).update_all('$addToSet' => {tag_ids: value})
       
        @a.reload
        puts "======= Last id: #{@a.tag_ids.last.inspect}"
        puts "======= Error!" if @a.tag_ids.last.kind_of? Array
      end
       
      test_add_to_set 1
       
      class A
        has_and_belongs_to_many :tags, inverse_of: nil
      end
       
      test_add_to_set 2
      

      And here's the output:

        MOPED: 127.0.0.1:27017 INSERT       database=mongoid_test collection=as documents=[{"_id"=>"52305e0266d9f1e3f6000001"}] flags=[] (0.1080ms)
       
       
        MOPED: 127.0.0.1:27017 UPDATE       database=mongoid_test collection=as selector={"_id"=>"52305e0266d9f1e3f6000001"} update={"$addToSet"=>{:tag_ids=>1}} flags=[:multi] (0.1230ms)
        MOPED: 127.0.0.1:27017 QUERY        database=mongoid_test collection=as selector={:_id=>"52305e0266d9f1e3f6000001"} flags=[] limit=-1 skip=0 batch_size=nil fields=nil (4.4219ms)
      ======= Last id: 1
       
       
        MOPED: 127.0.0.1:27017 UPDATE       database=mongoid_test collection=as selector={"_id"=>"52305e0266d9f1e3f6000001"} update={"$addToSet"=>{:tag_ids=>[2]}} flags=[:multi] (0.1390ms)
        MOPED: 127.0.0.1:27017 QUERY        database=mongoid_test collection=as selector={:_id=>"52305e0266d9f1e3f6000001"} flags=[] limit=-1 skip=0 batch_size=nil fields=nil (0.3378ms)
      ======= Last id: [2]
      ======= Error!
      

        Attachments

          Activity

            People

            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: