codememo

아이템이 존재하는지 테스트하기 위해 MongoDB에 문의하는 방법

tipmemo 2023. 3. 19. 18:15
반응형

아이템이 존재하는지 테스트하기 위해 MongoDB에 문의하는 방법

MongoDB는 필드 값을 기반으로 아이템이 존재하는지 여부를 테스트하는 검색 또는 쿼리 방법을 제공합니까?우리는 상품의 전체 내용을 반환하지 않고 존재 여부만 확인하고 싶습니다.

카운트는 필요 없기 때문에 쿼리가 첫 번째 일치를 발견한 후 반환되는지 확인해야 합니다.카운트 퍼포먼스가 이상적이지 않기 때문에 그것이 중요합니다.다음 쿼리는 이를 달성해야 합니다.

db.Collection.find({ /* criteria */}).limit(1).size();

주의:find().count()디폴트로는,limit따라서 예기치 않은 결과가 반환될 수 있습니다(그리고 모든 일치 항목을 검색합니다). size()또는count(true)제한 플래그를 준수합니다.

극단으로 이동하려면 쿼리에서 대상 인덱스를 사용해야 합니다.대상 인덱스는 인덱스에만 액세스하지만 쿼리하는 필드가 색인화되어야 합니다.일반적으로는, 이 방법으로 할 수 있습니다.count()는 필드를 반환하지 않습니다.그러나 대상 인덱스는 다소 상세한 커서가 필요할 수 있습니다.

db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();

{
  // ...
  "cursor" : "BtreeCursor value_1",
  "indexOnly" : true,  // covered!
}

불행하게도,count()제공 안 함explain()그럴 가치가 있는지 없는지는 말하기 어려워요.늘 그렇듯이, 측정이 이론보다 더 나은 동반자이지만, 이론이 적어도 당신을 더 큰 문제로부터 구해줄 수 있다.

상품의 존재 여부를 가치로 확인할 수 있는 올바른 방법은 없다고 생각합니다.다만, (필드 선택으로) id만을 취득하는 것만으로 실행할 수 있습니다.

db.your_collection.find({..criteria..}, {"_id" : 1});

의 시작에는limit선택적 매개 변수: 문서의 존재 여부를 찾기 위한 실행 가능한 대안으로 사용됩니다.

db.collection.count({}, { limit: 1 })
// returns 1 if exists and 0 otherwise

또는 필터링 쿼리를 사용합니다.

db.collection.count({/* criteria */}, { limit: 1 })

일치하는 발생 횟수를 제한하면 전체 수집을 거치지 않고 일치하는 항목이 발견될 때마다 수집 검색이 중지됩니다.


시작, 이후count()대신 사용할 수 있는 권장되지 않는 것으로 간주됩니다.

db.collection.countDocuments({}, { limit: 1 })

또는 필터링 쿼리를 사용합니다.

db.collection.countDocuments({/* criteria */}, { limit: 1 })

findOne()은 항상 문서를 읽고 반환하므로 find() + limit()를 사용하는 것이 훨씬 빠릅니다.find()는 커서만 반환하고(또는 반환하지 않음) 커서 내에서 반복할 경우에만 데이터를 읽습니다.

db.collection.find({_id: "myId"}, {_id: 1}).limit(1)

(의 일부db.collection.findOne({_id: "myId"}, {_id: 1})).

자세한 내용은 이쪽:문서 존재 여부 확인– MongoDB의 findOne vs find

filter_dict = {"key":value}
if db.collection.count_documents(filter_dict):
    print("item is existed")
else:
    print("item is not existed")

Xavier의 답변 업데이트:

db.collection.countDocuments({}, { limit: 1 })

이 시점에서 콜백을 두 번째 인수로 예상하고 대신 사용할 수 있습니다.

db.collection.countDocuments({}).limit(1)

현재 다음과 같은 것을 사용하고 있습니다.

async check(query) {
  const projection = { _id: 1 };

  return !!db.collection.findOne(query, projection);
}

true 또는 false를 반환합니다.물론 최소 데이터 전송의 경우 _id: 1만 반환됩니다.

$exists 연산자는 여기에 언급되어 있지 않습니다.

db.collection.findOne({myFieldName: {$exists: 1}})

이치카미db.collection.findOne({myFieldName: {$exists: 0}})

「커서를 하세요.find() 입니다.findOne() 수 .db.collection.find({myFieldName: {$exists: 1}}).isExhausted()

:isExhausted()mongo방식만 해당

단순히 lodash 프레임워크 - _is Empty()를 사용했을 뿐입니다.

const {
    MongoClient,
    ObjectId
} = require('mongodb');
const _ = require('lodash');

MongoClient.connect(testURL, {
    useNewUrlParser: true
}, (err, client) => {
    let db = client.db('mycompany');

    if (err) {
        console.log('unable to connect to the mycompany database');
    } else {
        console.log('test connection to the database');
    };

    db.collection('employee').find({
        name: 'Test User'
    }).toArray((err, result) => {

        if (err) {
            console.log('The search errored');
        } else if (_.isEmpty(result)) {
            console.log('record not found')
        } else {
            console.log(result);
        };
    });
    client.close();
});

Java 및 Spring을 사용하는 경우 다음을 사용할 수 있습니다.

public interface UserRepository extends MongoRepository<User, ObjectId> {

    boolean existsByUsername(String username);

}

저는 좋아요.

언급URL : https://stackoverflow.com/questions/8389811/how-to-query-mongodb-to-test-if-an-item-exists

반응형