Hi all,
it is the first time I notice this and I am not sure that this has been written down somewhere and if it is known to others (and then what to do about it). I had an Object with a ByteArray and then tried to find this object using the ByteArray and it wasn’t found. It looks like the ByteArray will be converted to an “array”. When searching the ByteArray would not match it, an Array matches it. When using anArray to find the object and using a “getter” to get the value and comparing it will not lead to equality. I understand that Mongo doesn’t have same types (Array, OrderedCollection, ByteArray) as Smalltalk but I wonder if there can be done something to improve the situation? Is this known? Can we improve it? I can of course workaround it by converting it to an array/orderedcollection before comparing it. holger Example: | data repository test res | repository := VOMongoRepository database: 'dbtest'. data := #[1 2 3 4]. test := ZEByteArrayVoyage new. test byteArray: data. repository save: test. res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data ]. res. "---> UndefinedObject" res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data asArray]. res. "---> ZEByteArrayVoyage" res byteArray = data. “false.. OrderedCollection = ByteArray" res byteArray = data asArray. “OrderedCollection = Array" res byteArray = data asOrderedCollection. "true" |
Hi Holger,
by default, BSON should be decoding a ByteArray (if persisted as is) with data type “binary data”, and you should be receiving a ByteArray as expected when reading. This is how SmalltalkHub works so I suspect there is something else going on (otherwise, there would be many, many people angry :P). Can you confirm the code is being persisted as binary data? (just check in the database). A simple workaround is to define an accessor: MyClass class>>#myByteArray <mongoDescription> ^ VOMongoToOneDescription new attributeName: ‘byteArray'; accessor: (MAPluggableAccessor read: [ :anObject | anObject byteArray ] write: [ :anObject :value | anObject byteArray: value asByteArray ]); yourself cheers, Esteban > On 04 Sep 2015, at 19:51, Holger Freyther <[hidden email]> wrote: > > Hi all, > > it is the first time I notice this and I am not sure that this has been written down somewhere > and if it is known to others (and then what to do about it). > > I had an Object with a ByteArray and then tried to find this object using the ByteArray and > it wasn’t found. It looks like the ByteArray will be converted to an “array”. When searching > the ByteArray would not match it, an Array matches it. When using anArray to find the object > and using a “getter” to get the value and comparing it will not lead to equality. I understand > that Mongo doesn’t have same types (Array, OrderedCollection, ByteArray) as Smalltalk but > I wonder if there can be done something to improve the situation? > > Is this known? Can we improve it? I can of course workaround it by converting it to an > array/orderedcollection before comparing it. > > holger > > > Example: > > | data repository test res | > repository := VOMongoRepository database: 'dbtest'. > data := #[1 2 3 4]. > test := ZEByteArrayVoyage new. > test byteArray: data. > repository save: test. > > res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data ]. > res. "---> UndefinedObject" > > res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data asArray]. > res. "---> ZEByteArrayVoyage" > > res byteArray = data. “false.. OrderedCollection = ByteArray" > res byteArray = data asArray. “OrderedCollection = Array" > res byteArray = data asOrderedCollection. "true" |
Free forum by Nabble | Edit this page |