MongoDB : 하나의 필드에서 모든 문서 업데이트


214

나는 foo가상적 으로 수집 된 이름을 가지고있다 .

각 인스턴스 foo에는 epoch 이후의 UNIX 타임 스탬프 인 lastLookedAt라는 필드가 있습니다. MongoDB 클라이언트를 통해 모든 기존 문서 (약 20,000 개)에 대한 타임 스탬프를 현재 타임 스탬프로 설정하고 싶습니다.

이것을 처리하는 가장 좋은 방법은 무엇입니까?


답변:


458

예를 들어 버전에 관계없이 <update>is는 다음과 같습니다.

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

그러나 MongoDB 버전에 따라 쿼리가 다르게 보입니다. 버전에 관계없이 빈 조건 {}은 모든 문서와 일치해야합니다 . Mongo 쉘 또는 모든 MongoDB 클라이언트에서 :

$ version> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} 조건입니다 (빈 조건은 모든 문서와 일치합니다)

3.2> $ version> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} 조건입니다 (빈 조건은 모든 문서와 일치합니다)
  • {multi: true} "여러 문서 업데이트"옵션입니다

$ version <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) => Sun 11 월 16 일 02:19:46 -0500 44042
랜덤 비트

1
POSIX 시간은 초를 사용하는 반면 Javascript 시간은 밀리 초를 사용합니다. 그러나 Date.now () / 1000이 작동합니다. 반올림해야 할 수도 있습니다.
Philippe Plantier

psh 그것은 나를 위해 그것을 만든 빈 {}입니다. Phil
Jona

1
oldvalue + "some string"에 대해하는 방법
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 메소드를 사용합니다. 먼저 관심있는 모든 문서를 가져올 쿼리를 구성하고 변경하려는 필드를 업데이트합니다. Mongo의 업데이트는 첫 번째 문서에만 영향을 미치며 쿼리 결과로 생성 된 모든 문서를 업데이트하려면 '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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.