如何将整个集合与MongoDB/Pymongo中聚合表达式计算出的值进行匹配?

mbjcgjjk  于 2022-12-12  发布在  Go
关注(0)|答案(1)|浏览(136)

我有一个数据库的文章与许多关键字,相关的是年份和期刊。
我想计算最古老的期刊上发表了多少篇文章,以及该期刊的标题是什么。
因此,首先我需要计算出年份值最早的文章,然后从该文章中获取期刊名称,然后我需要将我的整个收藏与该期刊名称进行匹配,并计算我有多少个结果。
我目前仍然在将我的整个集合与上一个查询的结果进行匹配。

count = articles_collection.aggregate([
    {
        "$match": {
            "journal": {
                "$match": {
                    "year": {
                        "$ne": numpy.NaN
                    }
                },
                "$sort": {
                    "year": 1
                },
                "$limit": 1,
                "$getField": "$journal"
            }
        }
    }
])
for doc in count:
    print(doc)

但这会产生以下错误:

OperationFailure: unknown operator: $match, full error: {'ok': 0.0, 'errmsg': 'unknown operator: $match', 'code': 2, 'codeName': 'BadValue'}

一篇文章看起来像这样:

{   "_id": {     "$oid": "638d067e5bdfe572e919109a"   },   
    "key": "journals/sigmod/FeketeR22",  
    "author": [     "Alan D. Fekete",     "Uwe Röhm"   ],  
    "title": "Teaching about Data and Databases: Why, What, How?",   
    "journal": "SIGMOD Rec.",  
    "volume": "51",  
    "number": "2", 
    "year": "2022" 
}

我需要找到具有最早“年份”值的文章,从该文章中获取“期刊”值,然后获取集合中以该期刊为值的所有文章。

6jygbczu

6jygbczu1#

一种选择是先分组。如果你需要计算你的NaN,你可以用一个不能是前一年的值来替换它们(比如5000):

db.collection.aggregate([
  {$set:{year: {$cond:[{$eq:['$year', NaN]}, maxValue, '$year']}}},
  {$group: {
      _id: "$journal",
      count: {$sum: 1},
      year: {$min: "$year"}
  }},
  {$sort: {year: 1}},
  {$limit: 1}
])

了解它在playground example上的工作原理

相关问题