MongoDB: cập nhật mọi tài liệu trên một trường


214

Tôi có một thu thập được đặt tên theo foogiả thuyết.

Mỗi phiên bản của foocó một trường được gọi là lastLookedAt là dấu thời gian UNIX kể từ epoch. Tôi muốn có thể đi qua ứng dụng khách MongoDB và đặt dấu thời gian đó cho tất cả các tài liệu hiện có (khoảng 20.000 trong số chúng) thành dấu thời gian hiện tại.

Cách tốt nhất để xử lý này là gì?


Câu trả lời:


458

Bất kể phiên bản nào, ví dụ của bạn, <update>là:

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

Tuy nhiên, tùy thuộc vào phiên bản MongoDB của bạn, truy vấn sẽ khác nhau. Bất kể phiên bản nào, điều quan trọng là điều kiện trống {}sẽ phù hợp với bất kỳ tài liệu nào . Trong trình bao Mongo hoặc với bất kỳ ứng dụng khách MongoDB nào:

$ phiên bản> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} là điều kiện (điều kiện trống phù hợp với bất kỳ tài liệu nào)

3.2> $ phiên bản> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} là điều kiện (điều kiện trống phù hợp với bất kỳ tài liệu nào)
  • {multi: true} là tùy chọn "cập nhật nhiều tài liệu"

$ phiên bản <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} là điều kiện (điều kiện trống phù hợp với bất kỳ tài liệu nào)
  • falsedành cho tham số " upsert "
  • true dành cho tham số "đa" (cập nhật nhiều bản ghi)

Date.now () cũng trả về dấu thời gian. Xem developer.mozilla.org/en/JavaScript/Reference/Global_Objects/
mẹo

Nó vẫn cho tôi một cuộc hẹn mà không nơi nào gần đúng cho tất cả những trường hợp này của foo. Sau khi chạy mà tôi làm một db.foo.findOne () và lastLookedAt là: 1327691719186, mà dịch để JRuby-1.6.5: 011> Time.at (1327691719186) => Sun ngày 16 tháng 11 02:19:46 -0500 44.042
randombits

1
Thật tệ, thời gian POSIX sử dụng giây, trong khi thời gian Javascript sử dụng mili giây. Date.now () / 1000 nên hoạt động, mặc dù. Bạn có thể phải làm tròn nó.
Philippe Plantier

psh nó trống rỗng {} đã làm điều đó cho tôi, cảm ơn Phil
Jona

1
Cách thực hiện đối với oldvalue + "một số chuỗi"
Mahesh K

11

Mã này sẽ hữu ích cho bạn

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

4

Tôi đã sử dụng trình điều khiển MongoDB .NET được hơn một tháng nay. Nếu tôi làm điều đó bằng trình điều khiển .NET, tôi sẽ sử dụng phương thức Cập nhật trên đối tượng bộ sưu tập. Đầu tiên, tôi sẽ xây dựng một truy vấn sẽ đưa cho tôi tất cả các tài liệu tôi quan tâm và thực hiện Cập nhật trên các trường tôi muốn thay đổi. Cập nhật trong Mongo chỉ ảnh hưởng đến tài liệu đầu tiên và để cập nhật tất cả các tài liệu phát sinh từ truy vấn người ta cần sử dụng cờ cập nhật 'Đa'. Mã mẫu theo sau ...

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.