【问题标题】:MongoDb - Pop array element based on if conditionMongoDb - 根据 if 条件弹出数组元素
【发布时间】:2018-01-23 05:08:45
【问题描述】:

我正在尝试更新具有以下结构的 mongo 数据库。

{
"_id" : ObjectId("5a64d076bfd103df081967ae"),
"values" : [ 
    {
        "date" : "2018-01-22",
        "Price" : "1289.4075"
    }, 
    {
        "date" : "2018-01-22",
        "Price" : "1289.4075"
    }, 
    {
        "date" : "2015-05-18",
        "Price" : 1289.41
    }
],
"Code" : 123456,
"schemeStatus" : "Inactive"
}

我想比较前 2 个数组元素的日期值,即 values[0].date 和 values[1].date。如果两者都匹配,那么我想删除 values[0] 以便只有 1 个具有该日期的条目。

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    您可以使用聚合框架的管道和$out 作为最后一个阶段来更新您的集合

    db.collection.aggregate([
        {
            $addFields: {
                sameDate: {
                    $let: {
                       vars: {
                          fst: { $arrayElemAt: [ "$values", 0 ] },
                          snd: { $arrayElemAt: [ "$values", 1 ] }
                       },
                       in: { $cond: { if: { $eq: [ "$$fst.date", "$$snd.date" ] }, then: 1, else: 0 } }
                    }
                 }
            }
        },
        {
            $project: {
                _id: 1,
                values : { $cond: { if: { $eq: [ "$sameDate", 0 ] }, then: "$values", else: { $slice: [ "$values", 1, { $size: "$values" } ] } } },
                Code: 1,
                schemeStatus: 1
            }
        },
        { $out: "collection" }
    ])
    

    这里使用了一些更重要的运算符:

    • $cond 处理 if-else 逻辑
    • $let 定义一些辅助变量
    • $arrayElemAt 获取第一个和第二个元素
    • $slice 弹出第一个元素

    【讨论】:

    • 感谢@mickl 的回复。我不确定,但我们可以用上面的代码更新数据库吗?在这里,我们将结果放入新集合中。我试图修改上面的代码并更新集合但无法达到结果。
    • @Jitesh $out 可以将输出重定向到新集合(复制数据)或导致更新数据的同一集合
    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多