2017-03-17 72 views
0

我想用pymongo光標刪除集合中的文檔。但我有_id作爲嵌入式提交,我必須通過整個_id字段的刪除標準。通過傳遞嵌入文件來刪除文檔

{ 
    "_id" : { 
     "Path" : 0, 
     "TriggerName" : "KM_Topzones_In App", 
     "userId" : NumberLong(3408661), 
     "Date" : "01/09/2017", 
     "OfferType" : "NOOFFER" 
    }, 
    "OfferCount" : NumberLong(0), 
    "OfferName" : "NoOffer", 
    "desktopTop-normal" : NumberLong(1), 
    "mrcTop-normal" : NumberLong(1), 
    "appPostLoginOverlay-normal" : NumberLong(1) 
} 

刪除查詢:

>>> cursor=col.find() 
>>> slice=cursor[0:5] 
>>> for doc in slice: 
...  print doc['_id'] 
...  result=col.delete_one({"_id": doc['_id']}) 
...  result.deleted_count 
... 
{u'Date': u'01/09/2017', u'Path': 0, u'OfferType': u'NOOFFER', u'userId': 3408661L, u'TriggerName': u'KM_Topzones_In App'} 
0 
{u'Date': u'01/09/2017', u'Path': 0, u'OfferType': u'NOOFFER', u'userId': 1587308L, u'TriggerName': u'KM_Topzones_In App'} 
0 
{u'Date': u'01/09/2017', u'Path': 0, u'OfferType': u'NOOFFER', u'userId': 1049384L, u'TriggerName': u'KM_Topzones_In App'} 
0 
{u'Date': u'01/09/2017', u'Path': 0, u'OfferType': u'NOOFFER', u'userId': 3029181L, u'TriggerName': u'KM_Topzones_In App'} 
0 
{u'Date': u'01/09/2017', u'Path': 0, u'OfferType': u'NOOFFER', u'userId': 2884382L, u'TriggerName': u'KM_Topzones_In App'} 
0 

但不是刪除任何內容,有沒有辦法做到這一點?

請建議。

回答

1

要做到這一點,你需要使用「點號」,因爲field's order matter here.

db.collection.deleteOne({ 
    "_id.Path": 0, 
    "_id.TriggerName" : "KM_Topzones_In App", 
    "_id.userId" : NumberLong(3408661), 
    "_id.Date" : "01/09/2017", 
    "_id.OfferType" : "NOOFFER" 
}) 

在你的情況,你可以使用字典理解這樣構建查詢過濾器:

query = {"_id.{key}".format(key=key): value for key, value in doc['_id'].items()} 

然後通過query.delete_one()

result = col.delete_one(query) 
+0

@ Styvan e非常感謝,但在我的情況下,我需要'查詢中的小改動。即查詢= {「_id。{key}」。format(key = key):鍵值的值,doc ['_ id']。items()}中的值' – lki

+0

@@ Styvane,是否有可能在刪除,我希望它在到達_id.Date'字段的特定日期時停止。 – lki

+0

您只能通過在查詢過濾器中使用_id.Date'字段來選擇要刪除的文檔。但是如果你有一個有效的Date對象,這將會很有用。 – styvane