如何查询MongoDB以测试项是否存在?

时间:2011-12-05 18:10:16

标签: mongodb find

MongoDB是否提供查找或查询方法来根据任何字段值测试项目是否存在?我们只是想检查存在,而不是返回项目的全部内容。

9 个答案:

答案 0 :(得分:52)

由于您不需要计数,因此应确保查询在找到第一个匹配项后返回。自count performance is not ideal以来,这一点非常重要。以下查询应该实现:

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

请注意,find().count()默认情况下尊重limit子句,因此可能会返回意外结果(并会尝试查找所有匹配项)。 size()count(true)将遵守限制标记。

如果您想要达到极限,则应确保您的查询使用covered indexes。涵盖的索引仅访问索引,但它们要求您查询的字段已编制索引。一般来说,这应该这样做,因为count()显然不会返回任何字段。尽管如此,覆盖的索引有时需要相当冗长的游标:

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

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

不幸的是,count()没有提供explain(),所以很难说它是否值得。像往常一样,测量是比理论更好的伴侣,但理论至少可以帮助你摆脱更大的问题。

答案 1 :(得分:25)

我不相信有一种直接的方法可以通过它的值来检查项目的存在。但是你可以通过只检索id(with field selection

来做到这一点
db.your_collection.find({..criteria..}, {"_id" : 1});

答案 2 :(得分:12)

  

使用find()+ limit()要快得多,因为findOne()   将始终读取+返回文档(如果存在)。找()只是   返回一个游标(或不返回),只在迭代时才读取数据   通过光标。

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

(而不是db.collection.findOne({_id: "myId"}, {_id: 1}))。

查看更多详情:Checking if a document exists – MongoDB slow findOne vs find

答案 3 :(得分:7)

Mongo 2.6 开始,count具有一个limit可选参数,这使其成为查找文档是否存在的可行选择:

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

或带有过滤查询:

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

限制匹配项的出现次数会使查找集合时停止扫描,而不是遍历整个集合。


Mongo 4.0.3 开始,由于count()considered deprecated,因此我们可以改用countDocuments

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

或带有过滤查询:

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

答案 4 :(得分:0)

我只使用了lodash框架-_isEmpty();

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

MongoClient.connect(testURL,{useNewUrlParser:true},(err,client)=> {     让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();

});

答案 5 :(得分:0)

我当前正在使用类似这样的内容:

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

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

它将返回true或false,当然只返回_id:1以进行最小的数据传输。

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

Xavier答案的更新:

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

现在将回调作为第二个参数,因此可以代替:

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

答案 8 :(得分:-4)

如果你使用Java和Spring,你可以使用它:

public interface UserRepository extends MongoRepository<User, ObjectId> {

    boolean existsByUsername(String username);

}

它对我有用。