2010-09-15 12 views
11

Nella shell MongoDB, se faccio il seguente, quindi viene creato un indice, e anche prevenire i record duplicati da essere inserito:Perché MongoDB può creare indici univoci ma Mongoid non può?

db.analytics.ensureIndex({page: 1, some_id: 1, ga_date: -1}, {unique: true}); 

ma ho pensato Mongoid può fare lo stesso: http://mongoid.org/docs/indexing/

così ho:

class PageAnalytic < Analytic 
    include Mongoid::Document 
    field :page, :type => String 
    field :some_id, :type => Integer 
    field :ga_date, :type => Time 
    field :pageviews, :type => Integer 
    field :timeOnPage, :type => Integer 
    index(
    [ 
     [ :page, Mongo::ASCENDING ], 
     [ :some_id, Mongo::ASCENDING ], 
     [ :ga_date, Mongo::DESCENDING ] 
    ], 
    :unique => true 
) 
end 

e fare un

rake db:create_indexes 

ma ancora, i record duplicati possono essere inseriti?

Aggiornamento: è abbastanza strano, ma dopo che ho aggiunto l'indice nel guscio MongoDB e far cadere la raccolta, e quindi ricreato l'indice sia in Shell MongoDB o Mongoid, ora posso cadere la raccolta in guscio MongoDB , quindi rake crea l'indice e usa mongoid per aggiungere due volte gli stessi documenti, e mongod dirà l'errore per la chiave duplicata.

+0

quale versione di mongeo stai usando? –

risposta

7

Hai usato il modo normale per salvare il tuo modello? Come:

page_analyitc.save

Se si utilizza questo modo per salvare il modello, mongoid non darà alcun messaggio di errore (se ha una chiave duplicata su MongoDB)

Quindi il modo corretto per farlo. sta usando:

page_analyitc.safely.save

intende sollevare un errore del tipo:

Mongo :: OperationFailure: 11001: E11001 chiave duplicata aggiornata

Speranza queste informazioni possono aiutare.

0

Quando aggiungi un documento index nel documento, mongoid non creerà alcun indice automaticamente. Per creare l'indice, devi eseguire l'attività di rake rake db:mongoid:create_indexes come puoi vedere nei nuovi documenti http://mongoid.org/en/mongoid/docs/indexing.html.

Problemi correlati