나는 foo
가상적 으로 수집 된 이름을 가지고있다 .
각 인스턴스 foo
에는 epoch 이후의 UNIX 타임 스탬프 인 lastLookedAt라는 필드가 있습니다. MongoDB 클라이언트를 통해 모든 기존 문서 (약 20,000 개)에 대한 타임 스탬프를 현재 타임 스탬프로 설정하고 싶습니다.
이것을 처리하는 가장 좋은 방법은 무엇입니까?
답변
예를 들어 버전에 관계없이 <update>
is는 다음과 같습니다.
{ $set: { lastLookedAt: Date.now() / 1000 } }
그러나 MongoDB 버전에 따라 쿼리가 다르게 보입니다. 버전에 관계없이 빈 조건 {}
은 모든 문서와 일치해야합니다 . Mongo 쉘 또는 모든 MongoDB 클라이언트에서 :
db.foo.updateMany( {}, <update> )
{}
조건입니다 (빈 조건은 모든 문서와 일치합니다)
db.foo.update( {}, <update>, { multi: true } )
{}
조건입니다 (빈 조건은 모든 문서와 일치합니다){multi: true}
“여러 문서 업데이트”옵션입니다
db.foo.update( {}, <update>, false, true )
{}
조건입니다 (빈 조건은 모든 문서와 일치합니다)false
” upsert “매개 변수 용true
“multi”매개 변수 용입니다 (여러 레코드 업데이트)
답변
이 코드는 당신에게 도움이 될 것입니다
Model.update({
'type': "newuser"
}, {
$set: {
email: "abc@gmail.com",
phoneNumber:"0123456789"
}
}, {
multi: true
},
function(err, result) {
console.log(result);
console.log(err);
})
답변
나는 한 달 넘게 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);