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?


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)

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: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.