通过传递嵌入的文件,用光标删除文档

时间:2017-03-17 10:21:01

标签: mongodb mongodb-query pymongo

我想使用带有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 个答案:

答案 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)