call-me-corgi
call-me-corgi

Reputation: 243

mongodb aggregate drop subfield using $unset

Suppose I have documents looks like this, and I want to drop info.$time field using $unset operator.

{
  "id": 1234,
  "info": {
    "msg": "hello world",
    "$time": Timestamp(1610515499)
  }
}

I've tried

db.aggregate([
  { $unset: [ "info.$time" ] },
  // next stage
])

but this gives error.

"errmsg" : "Invalid $project :: caused by :: FieldPath
field names may not start with '$'."

I also tried just "info.time" but this doesn't actually drop the field.

Upvotes: 0

Views: 157

Answers (1)

D. SM
D. SM

Reputation: 14480

As mentioned in comments fields starting with $ are unsupported.

If you are using a driver rather than MongoDB shell you should receive an error when you try inserting such data:

irb(main):006:0> a['foo'].insert_one({foo:{'$bar'=>1}})
Traceback (most recent call last):
       16: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/operation/shared/sessions_supported.rb:226:in `tap'
       15: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/operation/shared/sessions_supported.rb:231:in `block in build_message'
       14: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/msg.rb:152:in `serialize'
       13: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/message.rb:192:in `serialize'
       12: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/message.rb:331:in `serialize_fields'
       11: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/message.rb:331:in `each'
       10: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/message.rb:343:in `block in serialize_fields'
        9: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/serializers.rb:187:in `serialize'
        8: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/serializers.rb:187:in `each'
        7: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/serializers.rb:194:in `block in serialize'
        6: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/serializers.rb:316:in `serialize'
        5: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/serializers.rb:316:in `each'
        4: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/serializers.rb:317:in `block in serialize'
        3: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mongo-2.14.0/lib/mongo/protocol/serializers.rb:358:in `serialize'
        2: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bson-4.11.1/lib/bson/hash.rb:42:in `to_bson'
        1: from /home/w/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bson-4.11.1/lib/bson/hash.rb:42:in `put_hash'
BSON::String::IllegalKey ('$bar' is an illegal key in MongoDB. Keys may not start with '$' or contain a '.'.)

Upvotes: 1

Related Questions