0

我有一个 mongo 数据库和几个集合。我想从集合中删除所有匹配的条目,比如 target_id。诀窍是我还必须删除与 target_id 匹配的条目“连接”的条目。

例如

DB
Culture   (_id, owner_id)
Document  (_id, target_id)
Entity    (_id, target_id)
Field     (_id, entity_id)
Form      (_id, target_id)
Question  (_id, form_id)
Layout    (_id, question_id)

现在,我可以通过以下方式轻松删除所有文档

db.Document.remove( {"_id": ObjectId(target_id)});

所以第一个棘手的部分是文化集合中的某些条目可能有 owner_id = document_id。因此,在删除实体条目之前,我还必须删除文化条目。

第二个问题是我不能通过字段集合中的target_id条目直接访问,因为这些字段可以通过entity_id找到。

因此,我想编写一个脚本/查询以从提供 target_id 的 mongo shell 运行,然后删除 target_id 直接或间接“引用”的所有条目。我没有通过 id 进行简单的查找/删除的经验,所以这个查询被卡住了。

据我了解,我可以一步一步地做到这一点,比如说,首先找到所有实体:

db.Entity.find({ "$where" : "{"target_id" : ObjectId(target_id)}" });

第二步是从上面的查询中删除所有拥有 owner_id = entity id 的每个实体的文化。我怎么能跑

db.Culture.find({ "$where" : "{"owner_id" : ObjectId(entity_id)}" });

entity_id 遍历所有实体的第一个查询在哪里?

4

2 回答 2

1

IIUC,您正在寻找$in运算符。

  1. set1 = 查找所有要删除的 id
  2. set2 = 查找 set1 中 id 的所有引用 id
  3. 使用 set2 删除与 in 运算符匹配的所有文档
  4. 使用 set1 删除与 in 运算符匹配的所有文档

在层次结构中重复执行此操作...

例子:

db.Culture.find({"owner_id" : {"$in":[set_of_entityids]" }});

请注意,您从查询中获取 bson id,因此您可能不需要使用 ObjectId 作为前缀

高温高压

于 2013-04-10T11:20:26.497 回答
0

使用 findAndMondify 的一种方法。您可以在更新文档的同时获取 ID。因此,您将文档标记为 ACTIVE = FALSE ,然后在 findAndModify 中获取 Id。最后删除所有 ACTIVE = FALSE 的条目。您可以查看我在应用程序中的使用方式:http: //devesh4blog.wordpress.com/2013/03/01/findandmodify-in-mongodb-a-practical-example/

于 2013-04-10T11:22:39.007 回答