[hibernate-dev] [OGM] MongoDB dialect and treatment of _id

Emmanuel Bernard emmanuel at hibernate.org
Wed Apr 25 06:04:53 EDT 2012


Any more thoughts on that?
I like Sanne's approach but it means that people not use @Column will very often have id and _id and of course that we need to maintain secondary indexes.

On 10 avr. 2012, at 16:26, Sanne Grinovero wrote:

> Why should we not rely on the flexibility of the object/physical
> mapping we normally provide to relational database users?
> 
> Specifically, would it be possible to use "javax.persistence.Column"
> to have the user specify how the @Id attribute should be mapped in the
> "physical" MongoDB "schema" ?
> 
> If that's possible, we'd use your proposal "Use _id as a OracleDB
> rowid" for cases the user specifically asked to use a different
> property, or use the _id when he's asking us to do so.
> 
> The next question would be, should we use _id by default if no
> explicit option is set? I'd rather be consistent and use the attribute
> name, even if that is suboptimal in MongoDB, as I think we should
> provide the same flexibility people is used to when using Hibernate,
> like the ability to highly customize the mapping, to have it play
> nicely even with existing legacy schemas.
> 
> Assuming using an attribute named "id" is a common convention, maybe
> we could have a dialect option to either
>  a) assume the mapping "id" > "_id" ?
>  b) prefix all attributes with an underscore?
> 
> Sorry for not answering directly to your points, I'm not familiar with
> the MongoDB best practices.
> 
> Cheers,
> Sanne
> 
> On 10 April 2012 14:54, Nicolas Helleringer
> <nicolas.helleringer at gmail.com> wrote:
>> My DBA background tells me 'do not do thing behind the back of rou db' : I
>> shall use the second strategy.
>> 
>> But I am not sure what is the exact contract around _id column from the
>> MongoDb devs.
>> 
>> Niko
>> 
>> 2012/4/6 Emmanuel Bernard <emmanuel at hibernate.org>
>> 
>>> I would like to discuss the problem of _id in MongoDB and how to map that
>>> in Hibernate OGM.
>>> 
>>> MongoDB is a bit psycho-rigid in how it uniquely identifies a document. A
>>> special property named _id is used for that and must be unique across a
>>> collection. It is also strongly recommended to let MongoDB generate this id
>>> (a UUID essentially).
>>> 
>>> In the MongoDb dialect we have not settled on how to use _id. and I would
>>> like to clarify that. Today we use `dbObject.put(ID_FIELDNAME,
>>> key.getColumnValues()[0])` but that is only correct if the id property is
>>> mapped to a single column. (ie `key.getColumnNames().length == 1`)
>>> 
>>> ## Use _id as a OracleDB rowid
>>> 
>>> We could decide to use _id as a purely internal identifier for a document
>>> and basically never ever rely on it. All queries and lookup with use the
>>> identifier columns and their value to find a document.
>>> That has the benefit of not having to deal with _id but I don't know if
>>> that's an OK practice in MongoDB or if it's not recommended at all as it
>>> would lead to costly lookups. Anybody familiar with MongoDB can shime in?
>>> 
>>> ## Map _id when we have a identifier mapped on one column
>>> 
>>> In this case, I will only discuss the case where an id is mapped to a
>>> single column.
>>> We could decide to map the id column value to both the id column and to
>>> _id. That creates some duplication but OGM would be happy and MongoDB's
>>> queries could be efficient.
>>> Alternatively, we could decide to completely ignore the id column name and
>>> use _id for this. The TupleShapshot would then be responsible for binding
>>> the id column name to the value stored in _id. My concern with the
>>> alternative is that someone reading the data from the mongodb store will
>>> not find the JPA id column but rather see _id. On the other hand it seems
>>> to be the norm in the MongoDB land.
>>> 
>>> ### Identifiers mapped on several columns
>>> 
>>> In this case, we have three approaches that can be combined:
>>> 
>>> 1. treat _id as rowid (see avove)
>>> 2. map id values as a complex object and put that in _id  eg { "_id": {
>>> "firstname": "Emmanuel", "lastname": "Bernard"} }
>>> 
>>> Note that we can then decide to bind the id columns as top level
>>> attributes of the document as well.
>>> 
>>> Do you guys have any thoughts on the best approach?
>>> _______________________________________________
>>> hibernate-dev mailing list
>>> hibernate-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>> 
>> _______________________________________________
>> hibernate-dev mailing list
>> hibernate-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/hibernate-dev




More information about the hibernate-dev mailing list