2016-03-08 77 views
0

如何編寫一個嵌套查詢涉及兩個集合。mongodb腳本用於刪除兩個集合中的文檔

例如我有學生和作業集合。

Student: 

{ 
"_id":"556", 
"name":"sam", 
"assignment":[{"2","3"}] 
} 

Assignment: 
{ 
"_id":"2", 
"name":"math" 
} 

{ 
"_id":"3", 
"name":"english" 
} 

我如何可以編寫一個腳本,當學生ID = 556刪除,相關轉讓文件也得到刪除

這是集合的樣子JSON格式,

{ 
    "_id" : "123", 
    "media" : [ 
     "33", 
     "44" 
    ], 
    "sectionId" : "dd", 
    "courseId" : "string", 
    "startDate" : "string", 
    "endDate" : "string", 
    "title" : "string" 
} 

所以我想要獲得媒體ID並在$中使用它

回答

1

在刪除學生之前,請在列表中獲取賦值id,然後將該數組用作刪除文檔的查詢s在作業集合中。東西 像下面的操作:

// Get assignmentIds = ["2", "3"] 
var assignmentIds = db.student.findOne({"_id": "556"}).assignment; 
// Delete student 
db.student.remove({"_id": "556"}); 
// Delete associated assignments 
db.assignment.remove({ "_id": { "$in": assignmentIds } }); 

假如你有一個返回多個文檔,並且需要使用find(),而不是findOne()則需要由find()返回iterate the cursor查詢標準函數,將每個文檔的代理id加載到一個數組中,然後在刪除操作中使用它。

使用上述相同的例子,則可以使用forEach()光標方法來迭代光標,串聯使用原生JavaScript的Array.concat()方法assignement ids數組。考慮下面的例子:

// Get assignment ids 
var assignmentIds = []; 
db.student.find({"firstName": "Jane"}).forEach(function (doc){ 
    assignmentIds = assignmentIds.concat(doc.assignment); 
}); 

// print the array 
printjson(assignmentIds); 

// Delete students 
db.student.remove({"firstName": "Jane"}); 

// Delete associated assignments 
db.assignment.remove({ "_id": { "$in": assignmentIds } }); 
+0

@Harshana這甚至不是一個有效的BSON文檔。你可以編輯你的問題來包含用'db.student.findOne({「_ id」:「556」})查詢返回的實際文檔,因爲'{「2」,「3」}'甚至不是有效的目的。 – chridam

相關問題