代码之家  ›  专栏  ›  技术社区  ›  arvymetal

MongoDB管道中的对象到组ID

  •  1
  • arvymetal  · 技术社区  · 6 年前

    我有一个MongoDB聚合管道,它返回这样的输出:

     [
        {
            "id": {
                "isPaid": false,
                "state": "approved",
                "updatedAt": "2018-06-27"
            },
            "state": "approved",
            "isPaid": false,
            "updatedAt": "2018-06-27",
            "totalCount": 1,
            "totalValue": 658.4332
        },
        {
            "id": {
                "isPaid": false,
                "state": "canceled",
                "updatedAt": "2018-05-30"
            },
            "state": "canceled",
            "isPaid": false,
            "updatedAt": "2018-05-30",
            "totalCount": 1,
            "totalValue": 1735.7175
        },
    ]
    

    对于利用它的系统,我需要 id 以字符串形式提供。

    因此,我想知道,使用聚合管道阶段,是否有一种优雅的通用方法将对象值连接/序列化为字符串:

    "id": {"isPaid": false, "state": "approved", "updatedAt": "2018-06-27"}
    类似于:
    "id": "0.approved.2018-06-27"

    1 回复  |  直到 6 年前
        1
  •  2
  •   Saravana    6 年前

    你可以使用 $concat

    db.t55.aggregate([
        {$addFields : {
            id : {$concat : [{$cond :["$isPaid", "1","0"]}, ".", "$state", "." ,"$updatedAt"]}
        }}
    ])
    

    使用 $toString 如果不只是真/假

    db.t55.aggregate([
        {$addFields : {
            id : {$concat : [{$toString :{$indexOfArray : [[false,true], "$isPaid"]}}, ".", "$state", "." ,"$updatedAt"]}
        }}
    ])
    

    输出

    { "_id" : ObjectId("5c3e794b21526e3ff4bf4ca2"), "id" : "0.approved.2018-06-27", "state" : "approved", "isPaid" : false, "updatedAt" : "2018-06-27", "totalCount" : 1, "totalValue" : 658.4332 }
    { "_id" : ObjectId("5c3e794b21526e3ff4bf4ca3"), "id" : "0.canceled.2018-05-30", "state" : "canceled", "isPaid" : false, "updatedAt" : "2018-05-30", "totalCount" : 1, "totalValue" : 1735.7175 }