pymongo中使用sort featu的MongoDB查询

2024-06-08 17:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我是MongoDB的新手,我正在尝试创建一个查询。你知道吗

我有一个列表,例如:mylist = [a,b,c,d,e] 我的数据集有一个具有类似列表的键:mydatalist = [b,d,g,e]

我想创建一个查询,它将返回至少包含mylist中一个数据的所有数据。你知道吗

我所做的一切。你知道吗

query = {'mydatalist': {'$in': mylist}}
selector = {'_id':1,'name':1}
mydata = collection.find(query,selector)

这是完美的工作。我唯一想做但做不到的事情就是根据mydatalist中mylist数据的数量对结果进行排序。有没有办法在查询中这样做,或者我必须在游标中手动这样做?你知道吗

更新示例:

mylist = [a,b,c,d,e,f,g]

#data from collection
data1[mydatalist] = [a,b,k,l] #2 items from mylist
data2[mydatalist] = [b,c,d,e,m] #4items from mylist
data3[mydatalist] = [a,u,i] #1 item from mylist

因此,我希望将结果排序为data2->;data1->;data3


Tags: 数据fromgt列表排序mongodbqueryselector
1条回答
网友
1楼 · 发布于 2024-06-08 17:46:06

因此,您希望结果按与您选择的数组匹配的数目排序。查找不是一件简单的事情,但可以通过aggregation framework完成:

 db.collection.aggregate([
    // Match your selection to minimise the 
    {$match: {list: {$in: ['a','b','c','d','e','f','g']}}},

    // Projection trick, keep the original document
    {$project: {_id: {_id: "$_id", list: "$list" }, list: 1}},

    // Unwind the array
    {$unwind: "$list"},

    // Match only the elements you want
    {$match: {list: {$in: ['a','b','c','d','e','f','g']}}},

    // Sum up the count of matches
    {$group: {_id: "$_id", count: {$sum: 1}}},

    // Order by count descending
    {$sort: {count: -1 }},

    // Clean up the response, however you want
    {$project: { _id: 0, _id: "$_id._id", list: "$_id.list", count: 1 }}
])

你的文件按你想要的顺序排列:

{
    "result" : [
        {
            "_id" : ObjectId("5305bc2dff79d25620079105"),
            "count" : 4,
            "list" : ["b","c","d","e","m"]
        },
        {
            "_id" : ObjectId("5305bbfbff79d25620079104"),
            "count" : 2,
            "list" : ["a","b","k","l"]
        },
        {
            "_id" : ObjectId("5305bc41ff79d25620079106"),
            "count" : 1,
            "list" : ["a","u","i"]
        }
    ],
    "ok" : 1
}

另外,可能值得一提的是,在所有最新的驱动程序版本中aggregate将返回一个游标,就像find一样。目前这是模拟的驱动程序,但从版本2.6它将真正成为现实。这使得aggregate成为实现调用中find的非常有效的“swap-in”替换。你知道吗

相关问题 更多 >