查询MongoDB中的查询结果

时间:2013-04-10 11:08:53

标签: mongodb database

我有一个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遍历所有内容的第一个查询?

2 个答案:

答案 0 :(得分:1)

IIUC,您正在寻找$in运营商。

  1. set1 =查找您要删除的所有ID
  2. set2 =在set1
  3. 中查找所有引用的ID ID
  4. 使用带有set2的in运算符删除与该id匹配的所有文档
  5. 使用set1
  6. 删除与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/