我遇到这个问题,我需要确保发布到我的终端的某些ObjectId
实际存在于各自的集合中。
为此,我在所有集合中发出一个简单的计数查询,并检查count > 0
:
db.collection.count({_id: {
$in: objectIds
}))
但是,这会导致每个集合都有一个新查询。是否有任何巧妙的方法可以跨多个集合发布计数(或其他查询)?
从性能的角度来看这很好,但是我要为MongoDB服务器的每个出站请求付费,我希望将它们保持在最低限度。
解决此问题的另一种方法是首先使用引用ID创建对象,然后对其运行聚合并检查空值:
db.collection.aggregate([
{
$match: { _id: newlyCreatedId }
},
{
$lookup: {
from: "nameOfCollectionOne",
localField: "collectionOneReference",
foreignField: "_id",
as: "collectionOneReference"
}
},
{
$lookup: {
from: "nameOfCollectionTwo",
localField: "collectionTwoReference",
foreignField: "_id",
as: "collectionTwoReference"
}
},
{
$lookup: {
from: "nameOfCollectionThree",
localField: "collectionThreeReference",
foreignField: "_id",
as: "collectionThreeReference"
}
}
])
并检查:
if(!objectRetunedFromAggregation.collectionOneReference[0] || !objectRetunedFromAggregation.collectionTwoReference[0] || !objectRetunedFromAggregation.collectionThreeReference[0]){
throw new Exception(...)
}
但这似乎是一个肮脏的解决方案,对吧?
答案 0 :(得分:1)
如果您一直执行此操作,“清洁”解决方案可能涉及创建一个集合_id
记录的新集合,以及_id
存在的集合。
当然,您会在插入时间内为此付费。但是,如果您的工作量比写入更多,那么权衡可能是值得的。
例如,您可以拥有idRepo
个集合,例如:
> db.idRepo.find()
{_id: 0, exists: ['coll_1', 'coll_2']}
{_id: 1, exists: ['coll_2']}
{_id: 2, exists: ['coll_3']}
....
其中_id
是您要跟踪的_id
字段,exists
包含_id
存在的集合名称数组。
然后,您只需要一个查询就可以找出某个_id
存在的集合。
请注意,您需要自己对此idRepo
集合进行内务管理,并且需要在那里插入/更新文档以反映其他集合中的情况。