-
Type: Bug
-
Resolution: Cannot Reproduce
-
Priority: Major - P3
-
None
-
Affects Version/s: 1.4.3
-
Component/s: None
-
Labels:None
-
Environment:OS: CentOS_5.4_x64_v4.4 [rev 4]
Architecture: x86_64
MongoDB: 1.4.3
-
ALL
Have a strange mongoDB behavior, looks like a bug: find() and count() works sometimes incorrect for "$type" requests (both in mongo shell and pymongo).
Problem found after fixing values from float to integer via Python script for col collection in fields parent.ancestors ( "parent" is array, "ancestors" is array.)
Python fixing script had run on all fields found by request:
db.col.find( { 'parent.ancestors':
})
Change was done by several means:
1) partial change
- update(
{"_id":..}
{"$unset": ...}
)
- update(
{"_id":..}
{"$set": ...}
)
2) change the whole entry (del and then assigning with int(value) for each) and saving the complete entry back with pymongo col.save(item)
A great number of values was changed (ok), but, after fix was complete, the mongoDB still reported 3232 non-integers('$type': 1) for this field.
Meantime, if any of reported non-integer entries is inspected with its _id, then mongoDB reports that the field is integer!!! (Expected result: mongo should report those values as non-integers OR it should not include those values into results of non-integer search)
> //state before fix to integers > db.col.find( { 'parent.ancestors': {'$type': 1} }).count() 640876 > //state after fix to integers > db.col.find( { 'parent.ancestors': {'$type': 1} }).count() 3232 > db.col.find( { 'parent.ancestors': {'$type': 1} },{_id:1}) { "_id" : ObjectId("4c3dd581b1833907a5000063") } { "_id" : ObjectId("4c402159b183392f5300c2dc") } { "_id" : ObjectId("4c3f724bb1833929b700fa1b") } { "_id" : ObjectId("4c401edab183392f5300b29a") } { "_id" : ObjectId("4c3f8cddb1833929b703149e") } { "_id" : ObjectId("4c3f38adb18339113203e518") } { "_id" : ObjectId("4c401a7eb183392f53008b69") } { "_id" : ObjectId("4c3f2b7bb183391132038592") } { "_id" : ObjectId("4c3f15afb183391132029d9d") } { "_id" : ObjectId("4c3f85dab1833929b7028749") } { "_id" : ObjectId("4c402fd1b183392f53012c1a") } { "_id" : ObjectId("4c40818cb183392f5302bdb8") } { "_id" : ObjectId("4c3f0e95b183391132022e04") } { "_id" : ObjectId("4c37e069b183393d030136c8") } { "_id" : ObjectId("4c3889ceb183393d03023dd4") } { "_id" : ObjectId("4c3acafab183393d0304c686") } { "_id" : ObjectId("4c3daccbb18339144e00004a") } { "_id" : ObjectId("4c3df945b1833907a500758b") } { "_id" : ObjectId("4c3ee4d9b18339113200ad43") } { "_id" : ObjectId("4c3ef11fb183391132011718") } has more > db.col.find( { 'parent.ancestors': {'$type': 1}, '_id': ObjectId("4c3f0e95b183391132022e04") }).count() 0 > db.col.find( {"_id": ObjectId("4c3dd581b1833907a5000063"), "parent.ancestors": {"$type": 1} }).count() 0 > // TESTING EACH VALUE of array: > db.col.find( {"_id": ObjectId("4c3dd581b1833907a5000063")},{parent:1}) { "_id" : ObjectId("4c3dd581b1833907a5000063"), "parent" : [ { "collection" : "col", "ancestors" : [ 68397, 68400, 309252, 309305, 309365, 309440, 309486, 309506, 309573, 309623 ], "parentGroupId" : 309623 } ] } > > db.col.find( { "parent.0.ancestors.0": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.2": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.3": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.4": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.5": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.6": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.6": {"$type": 1}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 0 > db.col.find( { "parent.0.ancestors.7": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.8": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1 > db.col.find( { "parent.0.ancestors.9": {"$type": 16}, "_id": ObjectId("4c3dd581b1833907a5000063") },{parent:1}).count() 1
Thus, it looks like find() and count() works sometimes incorrect for "$type" requests (both in mongo shell and pymongo).