MongoDB 展开错误:无法编码类型的对象:<class 'set'>

Posted

技术标签:

【中文标题】MongoDB 展开错误:无法编码类型的对象:<class \'set\'>【英文标题】:MongoDB Unwind Error: cannot encode object of type: <class 'set'>MongoDB 展开错误:无法编码类型的对象:<class 'set'> 【发布时间】:2022-01-07 16:10:41 【问题描述】:

希望你没事。

我似乎找不到通过“股权 ID”聚合以下文档的方法。


    "_id": 
        "$oid": "6001dc246192c700013e8252"
    ,
    "user": "blablabla",
    "_type": "User::Individual",
    "created_at": 
        "$date": "2021-01-15T18:17:11.130Z"
    ,
    "integrations": [
        "_id": 
            "$oid": "6001dc62e7a0970001258da8"
        ,
        "status": "completed",
        "authentication_failed_msg": null
    ],
    "portfolios": [
        "_id": 
            "$oid": "6001dc62e7a0970001258da9"
        ,
        "_type": "SimplePortfolio",
        "transactions": [
            "_id": 
                "$oid": "6001dc62e7a0970001258daa"
            ,
            "settlement_period": 2,
            "expenses": 0,
            "source": "integration",
            "_type": "Transaction::Equity::Buy",
            "date": 
                "$date": "2020-03-02T00:00:00.000Z"
            ,
            "shares": 100,
            "price": 13.04,
            "equity_id": "abcd"
        , 
            "_id": 
                "$oid": "6001dc62e7a0970001258dab"
            ,
            "settlement_period": 2,
            "expenses": 0,
            "source": "integration",
            "_type": "Transaction::Equity::Buy",
            "date": 
                "$date": "2020-03-02T00:00:00.000Z"
            ,
            "shares": 1000,
            "price": 1.03,
            "equity_id": "efgh"

我尝试了类似的东西

db.collection.aggregate(["$unwind": '$portfolios.transactions',
                         "$group" : "_id": "$equity_id"])

遇到错误InvalidDocument: cannot encode object: '$portfolios.transactions', of type: &lt;class 'set'&gt;

理想情况下,我想要一个按userequity_id 分组的列表及其份额的总和。有谁知道错误是由我的聚合还是文档结构引起的?

【问题讨论】:

试用 mongodb 文档非常好,它有这个 unwind example 你是对的@Takis_,感谢您指出这一点。我完全错过了这个“两阶段放松”的东西,这正是我所需要的。 【参考方案1】:

你应该$unwind两次。

db.collection.aggregate([
  
    "$unwind": "$portfolios"
  ,
  
    "$unwind": "$portfolios.transactions"
  ,
  
    "$group": 
      "_id": "$portfolios.transactions.equity_id"
    
  
])

mongoplayground

【讨论】:

哇,谢谢@YuTing。我从来没有想过要做两次,我想我得再研究一下:)

以上是关于MongoDB 展开错误:无法编码类型的对象:<class 'set'>的主要内容,如果未能解决你的问题,请参考以下文章

nodejs/mongoDB - 类型错误:无法读取未定义的属性“集合”

nodejs/mongoDB - 类型错误:无法读取未定义的属性“集合”

无法设置 windows media video 9 屏幕编码器

URL 格式错误,无法解析

无法使用 MongoDB + Node 创建多个对象

Spark 错误:无法找到存储在数据集中的类型的编码器