MongoDB: оновлення кожного документа в одному полі


214

У мене зібрана назва, названа fooгіпотетично.

Кожен екземпляр fooмає поле під назвою lastLookedAt, яке є часовою міткою UNIX з епохи. Я хотів би мати можливість пройти клієнт MongoDB і встановити цю часову позначку для всіх існуючих документів (близько 20 000 з них) на поточну часову позначку.

Який найкращий спосіб впоратися з цим?


Відповіді:


458

Незалежно від версії, для вашого прикладу <update>є:

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

Однак, залежно від вашої версії MongoDB, запит буде виглядати інакше. Незалежно від версії, головним є те, що порожня умова {}відповідає будь-якому документу . У оболонці Mongo або з будь-яким клієнтом MongoDB:

$ версія> = 3,2 :

db.foo.updateMany( {}, <update> )
  • {} це умова (порожня умова відповідає будь-якому документу)

3.2> $ версія> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} це умова (порожня умова відповідає будь-якому документу)
  • {multi: true} є опцією "оновити кілька документів"

$ версія <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} це умова (порожня умова відповідає будь-якому документу)
  • false- для параметра " upsert "
  • true призначений для параметра "multi" (оновлення декількох записів)

Date.now () також повертає часову позначку. Дивіться developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Philippe Plantier

Це все ще дає мені дату, яка не є близькою справа для всіх цих випадків foo. Після запуску я роблю db.foo.findOne () і lastLookedAt: 1327691719186, що перекладається на jruby-1.6.5: 011> Time.at (1327691719186) => Вс 16 листопада 02:19:46 -0500 44042
Випадкові орбіти

1
Мій поганий час POSIX використовує секунди, тоді як час Javascript використовує мілісекунди. Date.now () / 1000 повинен працювати. Можливо, доведеться її округлити.
Філіпп Платьє

psh, це те порожнє {}, що зробило це для мене, дякую Філу
Йона

1
Як це зробити для oldvalue + "деякий рядок"
Mahesh K

11

Цей код буде корисним для вас

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  

4

Я використовую драйвер MongoDB .NET вже трохи більше місяця. Якби я робив це за допомогою драйвера .NET, я використовував би метод Update на об'єкті колекції. По-перше, я побудую запит, який отримає мені всі цікаві мені документи, і я проведу Оновлення на полях, які я хочу змінити. Оновлення в Монго впливає лише на перший документ і для оновлення всіх документів, отриманих у результаті запиту, потрібно використовувати прапор оновлення "Multi". Зразковий код випливає ...

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.