MongoDB: zaktualizuj każdy dokument w jednym polu

214

Mam kolekcję o nazwie foo hipotetycznie.

Każde wystąpienie fooma pole o nazwie lastLookedAt, które jest znacznikiem czasu UNIX od epoki. Chciałbym móc przejść przez klienta MongoDB i ustawić ten znacznik czasu dla wszystkich istniejących dokumentów (około 20 000 z nich) na bieżący znacznik czasu.

Jaki jest najlepszy sposób radzenia sobie z tym?

randombits
źródło
Możliwy duplikat MongoDB: Jak zaktualizować wiele dokumentów za pomocą jednego polecenia?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

458

Bez względu na wersję na przykład <update>:

{  $set: { lastLookedAt: Date.now() / 1000 }  }

Jednak w zależności od wersji MongoDB zapytanie będzie wyglądać inaczej. Niezależnie od wersji kluczem jest to, że pusty warunek {}będzie pasował do dowolnego dokumentu . W powłoce Mongo lub w dowolnym kliencie MongoDB:

Wersja $> = 3,2 :

db.foo.updateMany( {}, <update> )
  • {} jest warunkiem (pusty warunek pasuje do dowolnego dokumentu)

3.2> $ wersja> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} jest warunkiem (pusty warunek pasuje do dowolnego dokumentu)
  • {multi: true} to opcja „aktualizuj wiele dokumentów”

Wersja $ <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} jest warunkiem (pusty warunek pasuje do dowolnego dokumentu)
  • falsedotyczy parametru „ upsert
  • true dotyczy parametru „wielu” (zaktualizuj wiele rekordów)
Philippe Plantier
źródło
Date.now () również zwraca znacznik czasu. Zobacz developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Philippe Plantier
Nadal podaje mi datę, która nie jest prawie odpowiednia dla wszystkich tych przypadków foo. Po uruchomieniu robię db.foo.findOne () i lastLookedAt: 1327691719186, co przekłada się na jruby-1.6.5: 011> Time.at (1327691719186) => niedz. 16 02:19:46 -0500 44042
randombits 27.01.12
1
Mój zły, czas POSIX używa sekund, podczas gdy czas Javascript używa milisekund. Date.now () / 1000 powinno jednak działać. Być może będziesz musiał to zaokrąglić.
Philippe Plantier
psh to takie puste {}, które mi to zrobiło, dzięki Phil
Jona,
1
Jak to zrobić dla oldvalue + „some string”
Mahesh K
11

Ten kod będzie dla ciebie pomocny

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "[email protected]",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  
Jitendra
źródło
4

Używam sterownika MongoDB .NET od nieco ponad miesiąca. Gdybym miał to zrobić za pomocą sterownika .NET, użyłbym metody aktualizacji na obiekcie kolekcji. Najpierw skonstruuję zapytanie, które dostarczy mi wszystkie dokumenty, którymi jestem zainteresowany, i zrobię aktualizację pól, które chcę zmienić. Aktualizacja w Mongo wpływa tylko na pierwszy dokument i aby zaktualizować wszystkie dokumenty wynikające z zapytania, należy użyć flagi aktualizacji „Wiele”. Przykładowy kod następuje ...

var collection = db.GetCollection("Foo");
var query = Query.GTE("No", 1); // need to construct in such a way that it will give all 20K //docs.
var update = Update.Set("timestamp", datetime.UtcNow);
collection.Update(query, update, UpdateFlags.Multi);
użytkownik 1163459
źródło