检查多个集合中是否存在ID

时间:2018-03-09 11:50:45

标签: mongodb aggregation-framework

我遇到这个问题,我需要确保发布到我的终端的某些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(...)
}

但这似乎是一个肮脏的解决方案,对吧?

1 个答案:

答案 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集合进行内务管理,并且需要在那里插入/更新文档以反映其他集合中的情况。