MongoDB是否提供查找或查询方法来根据任何字段值测试项目是否存在?我们只是想检查存在,而不是返回项目的全部内容。
答案 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);
}
它对我有用。