Pymongo按降序排序评论

时间:2017-10-19 19:25:58

标签: python mongodb pymongo

在一个小博客应用程序中,我想按日期降序排序评论。最新评论将是最高评论。

典型的帖子如下:

{
    "_id" : 15,
    "title" : "Soup making techniques",
    "content" : "In this tutorial we'd like to share best soup making practices.",
    "updatedate" : ISODate("2017-10-19T21:13:19.193Z"),
    "comments" : [
        {
            "content" : "This is my first comment.",
            "_id" : 25,
            "date" : ISODate("2017-10-19T21:13:31.328Z")
        },
        {
            "content" : "Another comment.",
            "_id" : 26,
            "date" : ISODate("2017-10-19T21:29:36.536Z")
        }
    ]
}

同样在python方面,相关代码看起来像这样;

post = document.find_one({'_id': int(number)}, sort=[("comments.date", -1)])

result = document.find_one( { '_id' : int(number) , "comments": { '$exists': True, '$ne': False } })

comments = []
commentlist = []

if result:
    commentlist = post['comments']
    print ("All comments", commentlist)

    for comment in commentlist:
        comments.append({'commentid' : comment['_id'], 'date' : comment['date'], 'content' : comment['content']})

1 个答案:

答案 0 :(得分:1)

关于您发布的架构设计,还有一些值得一提的事情:

  1. 如果一篇帖子有很多长评论,那么它的大小可能超过16 MB,这是MongoDB文档的大小限制。
  2. 如同您所发现的那样,将注释放入数组中会使排序变得困难。
  3. 您发布的Python脚本被强制提取comments数组并将它们逐个插入临时文档,以使其进入排序顺序。我不认为这种方法会有效。您至少有两个选项可以避免这样做:

    1. 在数组的开头插入新注释,以便数组始终按降序排序。使用$push修饰符$position可以实现此目的(参见https://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.sql.functions
    2. 将评论放在单独的集合中,并参考原始帖子。这使得它很容易排序,需要权衡相对更复杂的检索(但它不能比你现有的脚本更差)。
    3. 根据您的使用情况,选项1,2或两者都可能适用于您。

      您可能还想查看存储评论用例:https://docs.mongodb.com/manual/reference/operator/update/push/