2016-07-27 20 views
6

Moja aplikacja używa Mongoose i ma schemat, który wykorzystuje timestamps option:Pomiń timestamps middleware dla niektórych aktualizacji w Mongoose

var fooSchema = new Schema({ 
    name: String, 
}, { 
    timestamps: true, 
}); 
mongoose.model('Foo', fooSchema); 

Więc gdy aktualizacja jest napisane na gromadzenie, właściwość updatedAt zmienia się na bieżącej daty . Ale teraz chciałbym dodać kilka zmian, które powinny zaktualizować właściwość . Niektóre odpowiedzi na Stackoverflow (example) sugerują użycie Foo.collection jako podobno dostępnego macierzystego sterownika MongoDB. Tak więc spróbowałem:

Foo.collection.update({ _id: someFooId }, { $set: { name: 'New Name' } }); 

Jednak zmieniło się również właściwość updatedAt.

Jak mogę zaktualizować dokument bez zmieniania updatedAt?

+0

Mam ten sam dokładny problem. Czy kiedykolwiek znalazłeś rozwiązanie/obejście tego problemu? – danii

+1

@danii Nie, niestety nie. Usunąłem oprogramowanie pośrednie sygnatur czasowych i zaktualizowałem znaczniki czasu ręcznie w razie potrzeby. – str

Odpowiedz

0

Co mogę uzyskać, automatycznie aktualizujesz pole dateTime w polu updated_at. Musisz podać wartość domyślną dla updated_at w swoim schemacie, po prostu usuń to domyślne pole.

Na przykład.

var fooSchema = new Schema({ 
    name: String, 
}, { 
    updated_at:{ 
     type: Date, 
     default: Date.now 
    } 
}); 
mongoose.model('Foo', fooSchema); 

Zdjąć default field z updated_at a schemat będzie wyglądał następująco.

var fooSchema = new Schema({ 
    name: String, 
}, { 
    updated_at: Date 
}); 
mongoose.model('Foo', fooSchema); 
+0

"Musisz podać wartość domyślną dla updated_at w swoim schemacie" Nie, opublikowany schemat jest kompletny. A drugi parametr 'Schema' jest dla opcji, nie ma jednak opcji' updated_at'. – str

+0

- jak zmienia się twoje pole "updatedAt", jeśli nie ma takiego klucza? ps. Wpisuję 'updated_at' tylko w odniesieniu do twojego' updatedAt'. –

+0

Zobacz [opcje znacznika czasowego] (http://mongoosejs.com/docs/guide.html#timestamps), jak wspomniano w pytaniu. – str

1

Właśnie znalazłem rozwiązanie i działa ono idealnie.

mongoose.connection.db.collection('player').update(
    {_id: mongoose.Types.ObjectId('56cb91bdc5946f14678934ba')}, 
    {$set: {name: 'Test'}} 
}); 

To zapytanie nie zaktualizuje pola updatedAt. Mam nadzieję, że nadal tego potrzebujesz!