Czy istnieje sposób na dodanie pól created_at i updated_at do schematu mangusty bez konieczności ich przekazywania za każdym razem, gdy wywoływana jest funkcja new MyModel ()?
Pole created_at byłoby datą i jest dodawane tylko podczas tworzenia dokumentu. Pole updated_at będzie aktualizowane nową datą za każdym razem, gdy wywoływana jest metoda save () w dokumencie.
Próbowałem tego w moim schemacie, ale pole nie pojawia się, chyba że dodam je w sposób dokładny:
var ItemSchema = new Schema({
name : { type: String, required: true, trim: true }
, created_at : { type: Date, required: true, default: Date.now }
});
Odpowiedzi:
Począwszy od Mongoose 4.0, możesz teraz ustawić opcję znaczników czasu w schemacie, aby Mongoose zajął się tym za Ciebie:
Możesz zmienić nazwy pól używanych w następujący sposób:
http://mongoosejs.com/docs/guide.html#timestamps
źródło
UPDATE: (5 lat później)
UPDATE: (4 lata później)
Jeśli używasz
ObjectId
jako swojego_id
pola (co zwykle ma miejsce), wszystko, co musisz zrobić, to:Sprawdź moją oryginalną odpowiedź poniżej, jak uzyskać utworzony znacznik czasu z
_id
pola. Jeśli potrzebujesz użyć identyfikatorów z systemu zewnętrznego, sprawdź odpowiedź Romana Rhrna Nesterova.AKTUALIZACJA: (2,5 roku później)
Możesz teraz użyć opcji #timestamps z wersją mangusty> = 4.0.
Jeśli ustawisz sygnatury czasowe, przypisania mongoose
createdAt
iupdatedAt
pola do schematu, przypisany typ toDate
.Możesz także określić nazwy zbiorów sygnatur czasowych:
ORYGINALNA ODPOWIEDŹ:
Jeśli używasz ObjectId jako pola tożsamości, nie potrzebujesz
created_at
pola. ObjectIds mają metodę o nazwiegetTimestamp()
.To zwróci następujące dane wyjściowe:
Więcej informacji tutaj Jak wyodrębnić datę utworzenia z Mongo ObjectID
Aby dodać pole
updated_at
, musisz użyć tego:źródło
Oto, co ostatecznie zrobiłem:
źródło
getTimestamp()
Date.now()
miarę możliwości używaj również zamiastnew Date
szybszego, ponieważ jest to metoda statycznaUżyj wbudowanej
timestamps
opcji dla swojego schematu.To automatycznie doda
createdAt
iupdatedAt
pola do schematu.http://mongoosejs.com/docs/guide.html#timestamps
źródło
updatedAt
jest aktualizowany przy każdym nowym zapisie (po zmianie przedmiotu)Jeśli używasz
update()
lubfindOneAndUpdate()
z
{upsert: true}
opcjąmożesz użyć
$setOnInsert
źródło
_id
pola Mogo , nie potrzebujeszcreatedAt
pola. Sprawdź moją odpowiedź poniżej, aby uzyskać więcej informacji.Dodaj
timestamps
do swojejSchema
tak wtedycreatedAt
iupdatedAt
będzie automatyczne generowanie dla CiebiePonadto można zmienić
createdAt -> created_at
przezźródło
W ten sposób osiągnąłem, tworząc i aktualizując.
Wewnątrz mojego schematu dodałem utworzony i zaktualizowany w następujący sposób:
Następnie w mojej metodzie aktualizacji artykułu w kontrolerze artykułu dodałem:
Pogrubione sekcje to części, które Cię interesują.
źródło
Dokumenty: https://mongoosejs.com/docs/guide.html#timestamps
źródło
Możesz użyć
timestamp
wtyczki programu,mongoose-troop
aby dodać to zachowanie do dowolnego schematu.źródło
Możesz bardzo łatwo korzystać z tej wtyczki . Z dokumentów:
A jeśli chcesz, ustaw również nazwy pól:
źródło
możemy to osiągnąć również za pomocą wtyczki schematu .
W
helpers/schemaPlugin.js
plikuaw
models/ItemSchema.js
pliku:źródło
W schemacie modelu po prostu dodaj sygnatury czasowe atrybutu i przypisz mu wartość true , jak pokazano: -
źródło
Teraz możesz tego użyć, aby nie trzeba było uwzględniać tej opcji w każdej tabeli
źródło
Moja wersja mangusty to 4.10.2
Wygląda na
findOneAndUpdate
to, że działa tylko hakźródło
Użyj funkcji, aby zwrócić obliczoną wartość domyślną:
źródło
Date.now()
funkcji po prostu:...default: Date.now()
default: Date.now()
byłoby to złe. Jeśli już, to jestdefault: Date.now
. W przeciwnym razie wszystkie Twoje dokumenty będą miały tę samą sygnaturę czasową: Godzina rozpoczęcia aplikacji;)default: Date.now
strategia. dużo czystszy.Właściwie robię to z tyłu
Jeśli wszystko pójdzie dobrze z aktualizacją:
źródło
Sformatuj datę i godzinę za pomocą pakietu maszynowego-datetime.
Pakiet maszynowy jest świetny z przejrzystym interfejsem API, w przeciwieństwie do ekspresowego lub ogólnego świata Javascript.
źródło
Możesz użyć oprogramowania pośredniego i wirtualnych . Oto przykład dla twojego
updated_at
pola:źródło
name
. I tak, powinno być trwałe.