2013-04-10 161 views
0

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

例如

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)}); 

所以第一个棘手的部分easilily删除所有文件,是在文化收集一些条目可能有owner_id = DOCUMENT_ID。所以在我删除实体条目之前,我还必须删除文化条目。

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

所以我想编写一个脚本/查询从mongo shell提供的target_id运行,然后删除所有直接或间接被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

似乎你的数据是关系型的... mongo不是这种东西的好选择。 – tanaydin 2013-04-10 13:14:25

回答

1

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

  1. 设置1 =找到要删除
  2. 集2 =查找ID的所有引用的ID在设置1
  3. 删除匹配与ID的与SET2操作
  4. 删除所有文档匹配的所有文件的所有ID这与设置1

in运算符IDS做到这一点一再沿层次...

例如:

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

注意从查询得到BSON的ID,所以你可能并不需要的ObjectId

HTH

+0

什么是IIUC?是否有某种俚语 – Sammaye 2013-04-10 11:24:21

+0

如果我理解正确:) :) – 2013-04-10 11:25:23

+0

啊OK kool谢谢:) – Sammaye 2013-04-10 11:34:09