Python MongoDB:从投影中删除重复记录

Python MongoDB:从投影中删除重复记录,python,sql,mongodb,pymongo,projection,Python,Sql,Mongodb,Pymongo,Projection,如何从mongoDB投影中删除重复记录? 假设我有以下形式的mongo文档- {"_id":"55555454", "From":"Bob", "To":"Alice", "subject":"Hi", "date":"04102011"} {"_id":"55555455", "From":"Bob", "To":"Dave", "subject":"Hello", "date":"04102014"} {"_id":"55555456", "From":"Bob", "To":"Alice

如何从mongoDB投影中删除重复记录? 假设我有以下形式的mongo文档-

{"_id":"55555454", "From":"Bob", "To":"Alice", "subject":"Hi", "date":"04102011"} 
{"_id":"55555455", "From":"Bob", "To":"Dave", "subject":"Hello", "date":"04102014"}
{"_id":"55555456", "From":"Bob", "To":"Alice", "subject":"Bye", "date":"04112013"}
当我做一个简单的投影
db.col.find({},{“From”:1,“To”:1,“\u id”=0})

很明显这三张唱片都是这样的

{“From”:“Bob”,“To”:“Alice”}{“From”:“Bob”,“To”:“Dave”}{“From”:“Bob”, “致”:“爱丽丝”}

但是我想要的只是两张唱片,这样-

{"From":"Bob", "To":"Alice"} {"From":"Bob","To":"Dave"}
由于我的应用程序目前使用python(使用pymongo),所以我要做的是使用

result = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in l)]

是否有任何DB方法可以应用于投影,并且只给我两条记录

投影仅定义要在结果中显示的字段。这很像以以下内容开头的陈述:

选择从,到
与基本形式的

选择*
所以你真正想做的就是:

db.collection.find(
{“From”:“Bob”,“To”:“Alice”},
{“From”:1,“To”:1}
)
它实际上选择了您想要的记录,其形式与:

选择从,到
从集合
哪里
From=“Bob”
和“爱丽丝”
如果这确实会产生“重复”的结果,您可以使用aggregate将其删除:

db.collection.aggregate([
{“$match”:{
从“:”鲍勃“,”到“:”爱丽丝”
}}
{“$组”:{
“_id”:{
From:“$From”,“To”:“$To”
}
}}       
])

使用MongoDB和投影,仅使用
find
,无法减少和消除重复文档

find
命令将不起作用,因为您需要记住,它将光标返回到客户端,因此,无法将结果减少到只有那些没有二次传递的唯一文档

将其用作测试数据(删除了
\u id
):

您可以使用聚合:

> db.test.aggregate({ $group: { _id: { "From": "$From", "To": "$To" }}})
结果:

{
    "result" : [
        {
            "_id" : {
                    "From" : "David",
                    "To" : "Carl"
            }
        },
        {
            "_id" : {
                    "From" : "George",
                    "To" : "Carl"
            }
        },
        {
            "_id" : {
                    "From" : "Bob",
                    "To" : "Dave"
            }
        },
        {
            "_id" : {
                    "From" : "Bob",
                    "To" : "Alice"
            }
        }
],
    "ok" : 1
}

代码应该与上面建议的聚合管道非常相似。

感谢您抽出时间回答。我明白什么是投影,但我想在这之后,这是删除从投影视图重复项目@sanj哪一部分您没有实际选择查询中的项目,您不明白吗?这也在答案中。@sanj干净地提供了一些事实上可以提供答案的东西,如果你有重复的答案,尽管有干扰。
{
    "result" : [
        {
            "_id" : {
                    "From" : "David",
                    "To" : "Carl"
            }
        },
        {
            "_id" : {
                    "From" : "George",
                    "To" : "Carl"
            }
        },
        {
            "_id" : {
                    "From" : "Bob",
                    "To" : "Dave"
            }
        },
        {
            "_id" : {
                    "From" : "Bob",
                    "To" : "Alice"
            }
        }
],
    "ok" : 1
}