2012-10-10 27 views
8

Utworzono i chcę teraz zaimportować kolekcję dummy. jednym z pól w każdej pozycji są pola "utworzone" i "zaktualizowane". co mogę umieścić w pliku źródłowym/json, aby MongoDb używał bieżącej daty i czasu jako wartości przy imporcie?Znacznik czasu MongoDb

to przyzwyczajenie praca

"created" : Date() 
+0

Czy próbowałeś 'new Date()'? – udidu

+0

pojawia się błąd podczas analizowania błędu łańcucha JSON, gdy próbuję "new Date()" – Simba

+0

co masz na myśli mówiąc "source/json file"? – udidu

Odpowiedz

12

mongoimport przeznaczony jest do importowania istniejących danych dane w formacie CSV, TSV lub JSON. Jeśli chcesz wstawić nowe pola (takie jak znacznik czasu created), musisz ustawić dla nich wartość.

Na przykład, jeśli chcesz ustawić created znacznik czasu do chwili obecnej, można dostać uniksowego znacznika czasu z linii poleceń (co będzie sekund od początku epoki):

$ date +%s 
1349960286 

JSON <date> representation że mongoimport oczekuje, że jest to 64-bitowa liczba całkowita ze znakiem, reprezentująca milisekundy od epoki. Musisz pomnożyć unixtime wartość sekund przez 1000 i obejmują w pliku JSON:

{ "created": Date(1349960286000) } 

Alternatywnym rozwiązaniem byłoby dodać utworzone znaczniki czasu do dokumentów po ich włożeniu.

Na przykład:

db.mycoll.update(
    {created: { $exists : false }}, // Query criteria 
    { $set : { created: new Date() }}, // Add 'created' timestamp 
    false, // upsert 
    true // update all matching documents 
) 
+0

Co jeśli pole jest ISODate? Zauważyłem, że Date (timestamp) tworzy ciąg znaków, a ISODate (sametimestamp) tworzy zupełnie inną i nieoczekiwaną datę. Jak przekonwertować ciąg znaków na format ISODate? – Ketema

+4

Funkcja ['ISODate()' (https://github.com/mongodb/mongo/blob/v2.2/src/mongo/shell/utils.js#L400) jest wygodnym pomocnikiem do utworzenia 'Date () 'obiekty. Konstruktor 'ISODate()' oczekuje ciągu daty/czasu w stylu ISO8601, podczas gdy 'Date()' oczekuje unixtime (sekund od epoki). Jeśli wypróbujesz 'new Date()' i 'new ISODate()' w powłoce 'mongo', powinieneś zobaczyć, że oba generują tę samą wartość (' ISODate'). Oba formaty mają tę samą [reprezentację BSON] (http://bsonspec.org/#/specification), która jest datetime UTC. – Stennie

3

Jak Stennie słusznie zauważył, nie można tego zrobić z zaledwie mongoimport lub mongorestore: są tylko dla przywrócenia wcześniej rzucił danych. Prawidłowym sposobem wykonania tej czynności jest przywrócenie danych, a następnie zaktualizowanie przywróconych danych.

Dzięki nowemu mongo 2.6 możesz to łatwo wykonać, korzystając z operacji $currentDate, która została utworzona w celu aktualizacji czasu do bieżącego znacznika czasu.

W twoim przypadku trzeba coś

db.users.update( 
    {}, 
    { 
    $currentDate: { 
     created: true, 
     updated: true 
    }, 
    } 
) 
Powiązane problemy