[SERVER-27738] Positional operator ($) can choose wrong array element when there is a numerical path component Created: 18/Jan/17  Updated: 06/Dec/17  Resolved: 11/Aug/17

Status: Closed
Project: Core Server
Component/s: Querying
Affects Version/s: 3.2.11, 3.4.1
Fix Version/s: 3.5.12

Type: Bug Priority: Major - P3
Reporter: Dawid Esterhuizen Assignee: Tess Avitabile (Inactive)
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Related
is related to SERVER-18500 Resolve ambiguity of positional proje... Backlog
Backwards Compatibility: Minor Change
Operating System: ALL
Steps To Reproduce:

Create an Empty DB
Create a new Collection
Add 4 Documents:

{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e1"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lac" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc51")}]}
{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e2"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lpc" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc52")}]}
{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e3"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lac" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc53")}]}
{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e4"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lpc" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc54")}]}

Now Run 4 Queries, each to update the array in exactly the same way:

db.testing.update({"lac.tankId": ObjectId("587fa5f04f4efe9c42d0dc51"), "loc": [1,1] }, {$set:{"lac.$.test":1}})
db.testing.update({"lpc.tankId": ObjectId("587fa5f04f4efe9c42d0dc52"), "loc": [1,1] }, {$set:{"lpc.$.test":1}})
db.testing.update({"lac.tankId": ObjectId("587fa5f04f4efe9c42d0dc53"), "loc.0": 1, "loc.1":1 }, {$set:{"lac.$.test":1}})
db.testing.update({"lpc.tankId": ObjectId("587fa5f04f4efe9c42d0dc54"), "loc.0": 1, "loc.1":1 }, {$set:{"lpc.$.test":1}})

You will have 3 identical and 1 that does not look right.

Sprint: Query 2017-08-21
Participants:

 Description   

Using a different versions of the same query have different results when updating a value in an array.
If the array key name is alphabetically after the key "loc" field in the query it does not update but insert a blank subdocument.

changing

{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e3"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lac" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc53")}]}
{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e4"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lpc" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc54")}]}

with:

db.testing.update({"lac.tankId": ObjectId("587fa5f04f4efe9c42d0dc53"), "loc.0": 1, "loc.1":1 }, {$set:{"lac.$.test":1}})
db.testing.update({"lpc.tankId": ObjectId("587fa5f04f4efe9c42d0dc54"), "loc.0": 1, "loc.1":1 }, {$set:{"lpc.$.test":1}})

should result in

{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e3"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lac" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc53"), test: 1}]}
{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e4"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lpc" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc54"), test: 1}]}

but ends up with:

{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e3"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lac" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc53"), test: 1}]}
{ "_id" : ObjectId("587fa5ed7bc1efc69f4763e4"),  "loc" : [ NumberInt(1),  NumberInt(1) ],  "lpc" : [ { "tankId" : ObjectId("587fa5f04f4efe9c42d0dc54")}, {test: 1}]}



 Comments   
Comment by Githook User [ 11/Aug/17 ]

Author:

{'name': 'Tess Avitabile', 'email': 'tess.avitabile@mongodb.com'}

Message: SERVER-27738 Numerical path component should not provide value for positional operator
Branch: master
https://github.com/mongodb/mongo/commit/1672832a9f3c22597da948586a1f8bb9208effda

Comment by David Storch [ 18/Jan/17 ]

Hi desterhuizen,

I'm sending this to the Query Team for consideration. In the meantime, you may also be interested in related ticket SERVER-18500.

Best,
Dave

Generated at Thu Feb 08 04:16:03 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.