MongoDB - 없으면 삽입, 없으면 건너뛰기
Mongo에 조건부로 삽입이 가능합니까;
//Pseudo code
Bulk Insert Item :
If Key exists
Skip, don't throw error
If key does not exist
Add item
단일 삽입을 하면 오류가 반환되거나 컬렉션에 삽입될 수 있는데 대량으로 가능합니까?
여기서는 처리 방법에 따라 두 가지의 실제 선택지가 있습니다.
MongoDB의 upsert 기능을 사용하여 키 데이터가 존재하는 경우 기본적으로 "찾아보기"합니다.그렇지 않으면 데이터만 에 전달하고 다른 데이터는 건드리지 않습니다.
대량에서 "주문되지 않음" 작업을 사용합니다.오류가 반환되더라도 전체 업데이트 배치는 계속 진행되지만 오류 보고서는 이에 불과하며 오류가 아닌 모든 업데이트가 수행됩니다.
전체 예:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
var testSchema = new Schema({
"_id": Number,
"name": String
},{ "_id": false });
var Test = mongoose.model('Test',testSchema,'test');
mongoose.connect('mongodb://localhost/test');
var data = [
{ "_id": 1, "name": "One" },
{ "_id": 1, "name": "Another" },
{ "_id": 2, "name": "Two" }
];
async.series(
[
// Start fresh
function(callback) {
Test.remove({},callback);
},
// Ordered will fail on error. Upserts never fail!
function(callback) {
var bulk = Test.collection.initializeOrderedBulkOp();
data.forEach(function(item) {
bulk.find({ "_id": item._id }).upsert().updateOne({
"$setOnInsert": { "name": item.name }
});
});
bulk.execute(callback);
},
// All as expected
function(callback) {
Test.find().exec(function(err,docs) {
console.log(docs)
callback(err);
});
},
// Start again
function(callback) {
Test.remove({},callback);
},
// Unordered will just continue on error and record an error
function(callback) {
var bulk = Test.collection.initializeUnorderedBulkOp();
data.forEach(function(item) {
bulk.insert(item);
});
bulk.execute(function(err,result) {
callback(); // so what! Could not care about errors
});
},
// Still processed the whole batch
function(callback) {
Test.find().exec(function(err,docs) {
console.log(docs)
callback(err);
});
}
],
function(err) {
if (err) throw err;
mongoose.disconnect();
}
);
현재 운전자의 "변경된 동작"은 다음과 같은 결과 반응입니다..execute()
이전 릴리스에서 "순서가 지정되지 않은" 작업을 수행하지 않은 오류 개체를 반환합니다.
이것은 당신의 코드가 절대로 의존하지 않는 것을 필수적으로 만듭니다.err
혼자 돌아왔고, 당신은 돌려받은 사람들에게 영감을 주어야 합니다.result
오류의 전체 분류를 대신합니다.
그러나 순서가 지정되지 않은 경우 오류가 발생하더라도 배치는 끝까지 계속됩니다.오류가 아닌 것은 정상적으로 커밋됩니다.
이것은 결국 "순서가 중요하다"는 것으로 귀결됩니다.이 경우 "주문됨" 작업이 필요하며 "업서트"를 사용해야만 중복 키를 피할 수 있습니다.그렇지 않으면 "unordered"를 사용하지만 오류가 반환되고 실제로 의미하는 바를 알고 있어야 합니다.
또한, 사용 시.collection
기본 드라이버에서 기본 컬렉션 개체를 가져와 "Bulk" 작업을 활성화한 다음 항상 "some" mongoose 메서드 중 하나가 항상 먼저 호출되었는지 확인합니다.
그렇지 않으면 mongoose 메서드에 대해 처리되므로 네이티브 드라이버 메서드가 있는 데이터베이스에 대한 연결이 보장되지 않으므로 연결이 없어 작업이 실패합니다.
몽구스 방법을 먼저 "발포"하는 대신, 연결을 위해 앱 로직을 이벤트 수신기에 랩하는 것입니다.
mongoose.connection.on("open",function(err) {
// app logic in here
})
이미 언급했듯이, "존재하지 않는 경우 삽입"은 다음을 사용하여 달성할 수 있습니다.update
로의 지휘.upsert
옵션이 true로 설정됩니다.node. driver3.x node.js 파일을 과 같습니다.
let ops = [];
ops.push({ updateOne: { filter: {key:"value1"}, update: {} }, { upsert:true } });
ops.push({ updateOne: { filter: {key:"value2"}, update: { $set:{/*...*/} } }, { upsert:true } });
ops.push({ updateOne: { filter: {key:"value3"}, update: { { $setOnInsert:{/*...*/} } } }, { upsert:true } });
// < add more ops here >
await db.collection("my-collection").bulkWrite(ops, {ordered:false});
에 약에만.filter
를 반환하면 과 0을 하여 새 됩니다. 필터 조건을 사용하여 새 문서가 생성됩니다.$set
업데이트(있는 경우).사용하는 경우$setOnInsert
업데이트는 새 문서에만 적용됩니다.
제 상황에 도움이 되었을 것이기 때문에 이 사례를 게시하는 것입니다.db.collection에 대한 자세한 내용은 문서를 참조하십시오.bulkWrite.
사용하다setOnInsert
db.collection('collection').updateOne(
{ _id: data._id },
{ $setOnInsert: { ...data } },
{ upsert: true },
)
Mongodb 버전 4.4
https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/
언급URL : https://stackoverflow.com/questions/32430384/mongodb-insert-if-it-doesnt-exist-else-skip
'programing' 카테고리의 다른 글
하나의 분기에 대한 커밋 기록을 가져오는 방법은 무엇입니까? (0) | 2023.07.19 |
---|---|
socket.socket vs.socket.close (0) | 2023.07.19 |
플라스크에서 응답 헤더를 설정하려면 어떻게 해야 합니까? (0) | 2023.07.19 |
양식을 변경할 수 있습니까?인증 쿠키 이름? (0) | 2023.07.19 |
PySpark에서 데이터 프레임의 크기나 모양을 찾는 방법은 무엇입니까? (0) | 2023.07.19 |