MongoDb - 基于if条件的Pop数组元素

时间:2018-01-22 19:50:23

标签: mongodb mongoose mongodb-query

我正在尝试更新具有以下结构的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个数组元素的日期值,即值[0] .date和值[1] .date。如果两者都匹配,那么我想删除值[0],这样只有一个条目具有该日期。

1 个答案:

答案 0 :(得分:0)

您可以使用聚合框架的管道https://developer.apple.com/documentation/scenekit作为更新集合的最后阶段

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" }
])

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

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