2013-04-10 160 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