如何在MongoDB中删除引用损坏的文档?

piv4azn7  于 2022-12-03  发布在  Go
关注(0)|答案(3)|浏览(141)

我在Mongo有两个系列:

db.user.find():
{
  "_id": { "$oid" : "52db05e6a2cb2f36afd63c47" },
  "name": "John",
  "authority_id": { "$oid" : "52daf174a2cb2f62aed63af3" },
}
{
  "_id": { "$oid" : "52db05e6a2cb2f36afd63d00" },
  "name": "Joe",
  "authority_id": { "$oid" : "52daf174a2cb2f62aed63af3" },
}

db.authority.find():
{
  "_id": { "$oid" : "52daf174a2cb2f62aed63af3" },
  "name": "Sample Authority"
}

用户通过ObjectId存储对授权机构ID引用。
现在我的问题:有几个权限已经被删除了,不再在集合中。我需要找到一种方法,如果它们的authority_id指向已删除的权限,如何遍历“user”集合并删除它们。
我试过这个:

db.user.find(
    { 
      $where: function() { 
        db.authority.find({ _id: this.authority_id }).count() == 0  
      }
     })

但是“db”在那里是不可访问的。是否可以在迭代内部实现引用检查?

xytpbqjk

xytpbqjk1#

您可以使用聚合来查找所有孤立用户,然后将其删除。

const orphanUsers = db.user.aggregate([
    {
      // Join authority collection using authority_id
      $lookup: {
        from: "authority",
        localField: "authority_id",
        foreignField: "_id",
        as: "authority"
      }
    },
    // filter users without authority (means authority_id doesn't exist)
    { $match: { authority: [] } },
    // return only the _id
    { $project: { _id: "$_id" } }
])

// Delete all orphan users
db.user.deleteMany({
    _id: { $in: orphanUsers.map(({ _id }) => _id) }
})
vyswwuz2

vyswwuz22#

你可以通过在javascript shell上的光标上迭代或使用任何Mongo驱动程序来删除损坏的条目。下面的例子将给予你一个在javascript shell上做这件事的想法。

db.user.find().forEach((user) => {
    const authority = db.authority.findOne({'_id' : user.authority_id});

    if(!authority) db.user.remove({_id : user._id});
});
r1zk6ea1

r1zk6ea13#

根据http://docs.mongodb.org/manual/reference/operator/query/where/,“$where运算符表达式无法访问mongo shell中可用的某些全局函数或属性,如db”。
但您可以尝试贴图减少:http://cookbook.mongodb.org/patterns/pivot/
我会亲自用代码来做,但是您可能有不同的要求。

相关问题