【问题标题】: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_,感谢您指出这一点。我完全错过了这个“两阶段放松”的东西,这正是我所需要的。

标签: mongodb mongodb-query aggregation-framework pymongo


【解决方案1】:

你应该$unwind两次。

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

mongoplayground

【讨论】:

  • 哇,谢谢@YuTing。我从来没有想过要做两次,我想我得再研究一下:)
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多