3天前我開始學習MongoDB,在做練習時,服務器出現了一些意外的行爲。奇怪的MongoDB行爲
的行使要求寫一個小程序,從具有以下結構的文檔中刪除最低功課成績(這個文件是學生集合內):
{
"_id": 10,
"name": "Demarcus Audette",
"scores": [
{
"type": "exam"
"score": 47.42086
},
{
"type": "quiz"
"score": 44.83456
},{
"type": "homework"
"score": 39.0178956
},{
"type": "homework"
"score": 14.578344
}
]
}
不管怎麼說,寫程序我意外地犯了一個錯誤。這是我寫的
def removeHW(hw):
# establish a connection to the database
connection = MongoClient("localhost", 27017)
# get a handle to the school database
db = connection.school
students = db.students
# extract the scores into a list
scores = []
for i in range(1, len(hw)):
scores.append(hw[i]["score"])
# Now remove the lowest score from the database
query = {"_id": hw[0], "scores.score": min(scores),"scores.type": "homework"}
try:
students.remove(query)
except:
print "Unexpected error:", sys.exc_info()[0]
程序
我的程序背後的邏輯是,之後我提取含有從學生兩個家庭作業和_id詞典列表集合,我遍歷所有的字典,並把它傳遞給removeHW()函數。
我犯的錯誤是,我寫道:
query = {"_id": hw[0], "scores.score": min(scores),"scores.type": "homework"}
students.remove(query)
當我寫了下面的(這是正確的解決方案):
query = {"_id": hw[0], "scores.type": "homework"}
students.update(query, {"$pull": {"scores": {"score" : min(scores)}}})
是的,我知道到現在爲止似乎一切都安然無恙。我遇到的問題是,使用第一個解決方案(錯了),當MongoDB中刪除了所有來自學生收集的文件,並創建了一個新的集合包含所有從學生子文檔得分集合,除了一個我想要的去除(功課最低的作業)。我發現這種行爲非常奇怪,因爲我沒有使用過NoSQL數據庫的經驗,所以我想知道是什麼導致MongoDB做到這一點,爲什麼。
如果有人能幫助我理解,請做。我會永遠感謝你。
「永遠感激?」 :)這是一個很長的時間。你確定所有的文件都被刪除了嗎? (「學生」系列中有多少人)?'_id'應該將其限制爲一個文檔。而且,鑑於您提供的代碼中沒有插入/更新,我不明白它會如何完成您所說的內容。 – WiredPrairie
是的,我確定,學生收藏中有200個文檔,mongo創建的分數集合的結構如下:{{「_id」:10,「name」:「Demarcus Audette」,「type」: 「考試」,「分數」:44.654},{「_id」:10,「name」:「Demarcus Audette」,「type」:「家庭作業」,score:45.456},...},我告訴你這是我見過的最奇怪的事 – Codejunky
你通過移除HW的結構是什麼? – innoSPG