如何查询MongoDB以测试项目是否存在?
MongoDB是否提供了一个查找或查询方法来测试基于任何字段值的项是否存在?我们只想检查是否存在,而不是返回项目的全部内容。因为您不需要计数,所以应该确保查询在找到第一个匹配项后返回。因为,这是相当重要的。以下查询应完成以下操作:如何查询MongoDB以测试项目是否存在?,mongodb,find,Mongodb,Find,MongoDB是否提供了一个查找或查询方法来测试基于任何字段值的项是否存在?我们只想检查是否存在,而不是返回项目的全部内容。因为您不需要计数,所以应该确保查询在找到第一个匹配项后返回。因为,这是相当重要的。以下查询应完成以下操作: db.Collection.find({ /* criteria */}).limit(1).size(); 请注意,默认情况下,find().count()不遵守limit子句,因此可能会返回意外结果(并将尝试查找所有匹配项)size()或count(true)将
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()来实现这一点
使用find()+limit()要快得多,因为findOne()是
将始终读取并返回文档(如果存在)。正好
返回游标(或不返回),并且仅在迭代时读取数据
通过光标
db.collection.find({u-id:myId},{u-id:1}).limit(1)
(而不是db.collection.findOne({u id:myId},{u id:1})
)
查看更多详细信息:如果您使用Java和Spring,您可以使用:
public interface UserRepository extends MongoRepository<User, ObjectId> {
boolean existsByUsername(String username);
}
public interface UserRepository扩展了MongoRepository{
布尔existsByUsername(字符串用户名);
}
它对我有效。启动
Mongo 2.6
,有一个限制
可选参数,这使它成为查找文档是否存在的可行替代方法:
db.collection.count({}, { limit: 1 })
// returns 1 if exists and 0 otherwise
或使用筛选查询:
db.collection.count({/* criteria */}, { limit: 1 })
db.collection.countDocuments({/* criteria */}, { limit: 1 })
限制匹配出现次数会使集合扫描在找到匹配项时停止,而不是遍历整个集合
启动
Mongo 4.0.3
,因为count()
是我们可以使用的替代品:
或使用筛选查询:
db.collection.count({/* criteria */}, { limit: 1 })
db.collection.countDocuments({/* criteria */}, { limit: 1 })
我只是简单地使用了lodash框架-_isEmpty()
对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。是
db.Collection.find({/*criteria*/}).limit(1).size()代码>同步?您想要.count(使用\u limit\u和\u skip=True)
。没有名为.size()
的方法。似乎没有。size()方法find()
将始终返回光标(即使文档不存在-在这种情况下hasNext()
将返回false
。我使用findOne
而不是find
谢谢。既然所有ID都在内存中建立索引,这个查询对磁盘有什么作用吗?如果你能简单地执行result.length==0
,为什么要使用框架呢?虽然这个代码可能会解决问题,但一个好的答案也应该解释代码的作用以及它是如何帮助的。
filter_dict = {"key":value}
if db.collection.count_documents(filter_dict):
print("item is existed")
else:
print("item is not existed")
filter_dict = {"key":value}
if db.collection.count_documents(filter_dict):
print("item is existed")
else:
print("item is not existed")