我有一个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)});
所以第一个棘手的部分是,Culture集合中的某些条目可能拥有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 =每个实体的实体ID的文化。我该怎么办
db.Culture.find({ "$where" : "{"owner_id" : ObjectId(entity_id)}" });
其中entity_id遍历所有内容的第一个查询?
答案 0 :(得分:1)
IIUC,您正在寻找$in运营商。
在层次结构中反复执行此操作...
示例:
db.Culture.find({"owner_id" : {"$in":[set_of_entityids]" }});
请注意,您从查询中获取bson ID,因此您可能不需要使用ObjectId前缀
HTH
答案 1 :(得分:0)
使用findAndMondify进行此操作的方法之一。您可以在获得Ids的同时更新文档。因此,您将文档标记为ACTIVE = FALSE,然后在findAndModify中返回ID。在最后,只删除所有ACTIVE = FALSE的条目。您可以在我的应用程序中看到我的使用方式:http://devesh4blog.wordpress.com/2013/03/01/findandmodify-in-mongodb-a-practical-example/