Py学习  »  MongoDB

删除除第一个索引之外的MongoDB数组键

Sumit Tiwari • 6 年前 • 1759 次点击  

我有这样一个mongo db数据。

{
  "_id": "1234",
  "programId": ObjectId("1234"),
  "userId": "23",
  "courses": [
    {
      "stateName": "Stage 1",
      "duration": "5",
      "lag": "2",
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2018-12-01T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100,

    },
    {
      "stateName": "2nd stage",
      "duration": "60",
      "lag": "60",
      "courseType": "2",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-02-01T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "3rd Stage",
      "duration": "5",
      "lag": "2",
      "courseType": "1",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-04-07T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "4th stage",
      "duration": 1,
      "lag": "10",
      "courseType": "1",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-04-10T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "5th",
      "duration": "1",
      "lag": "0",
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-04-21T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "6th",
      "duration": "5",
      "lag": "5",
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-04-26T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "7th ",
      "duration": 1,
      "lag": "9",
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-05-02T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "8th",
      "duration": "66",
      "lag": 0,
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-07-16T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "9th",
      "duration": "61",
      "lag": 0,
      "courseType": "1",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-09-15T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "10th",
      "duration": "80",
      "lag": 0,
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-12-04T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    },
    {
      "stateName": "11th",
      "duration": "8",
      "lag": 0,
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2019-12-12T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100
    }
  ],
  "userStatus": 1,
  "modified": ISODate("2018-11-27T14:01:32.082+05:30"),
  "created": ISODate("2018-11-27T14:01:32.082+05:30"),
  "completionStatus": "F",
  "currentState": {
    "courseId": "116",
    "courseProgress": 100
  }
}

我想从courses数组中删除scheduledStartDate、scheduledEndDate、courseProgress,第一个索引除外。

我想要这样的结果

{
  "_id": "1234",
  "programId": ObjectId("1234"),
  "userId": "23",
  "courses": [
    {
      "stateName": "Stage 1",
      "duration": "5",
      "lag": "2",
      "courseType": "3",
      "scheduledStartDate": ISODate("2018-11-27T14:01:30.000+05:30"),
      "scheduledEndDate": ISODate("2018-12-01T14:01:30.000+05:30"),
      "transitionType": "onAssignment",
      "courseProgress": 100,

    },
    {
      "stateName": "2nd stage",
      "duration": "60",
      "lag": "60",
      "courseType": "2",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "3rd Stage",
      "duration": "5",
      "lag": "2",
      "courseType": "1",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "4th stage",
      "duration": 1,
      "lag": "10",
      "courseType": "1",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "5th",
      "duration": "1",
      "lag": "0",
      "courseType": "3",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "6th",
      "duration": "5",
      "lag": "5",
      "courseType": "3",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "7th ",
      "duration": 1,
      "lag": "9",
      "courseType": "3",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "8th",
      "duration": "66",
      "lag": 0,
      "courseType": "3",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "9th",
      "duration": "61",
      "lag": 0,
      "courseType": "1",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "10th",
      "duration": "80",
      "lag": 0,
      "courseType": "3",
      "transitionType": "onAssignment",
    },
    {
      "stateName": "11th",
      "duration": "8",
      "lag": 0,
      "courseType": "3",
      "transitionType": "onAssignment",
    }
  ],
  "userStatus": 1,
  "modified": ISODate("2018-11-27T14:01:32.082+05:30"),
  "created": ISODate("2018-11-27T14:01:32.082+05:30"),
  "completionStatus": "F",
  "currentState": {
    "courseId": "116",
    "courseProgress": 100
  }
}
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43202
文章 [ 1 ]  |  最新文章 6 年前
Ashh
Reply   •   1 楼
Ashh    7 年前

使用 $range 聚合以查找数组的索引 courses 然后使用 $map 聚合和删除 ("$$REMOVE") 索引不相等的字段 ($ne) 0

对于蒙哥大 三点六 及以上

db.collection.aggregate([
  { "$addFields": {
    "courses": {
      "$map": {
        "input": { "$range": [0, {"$size": "$courses" }] },
        "in": {
          "$let": {
          "vars": { "c": {"$arrayElemAt": ["$courses", "$$this"]} },
            "in": {
              "stateName": "$$c.stateName",
              "duration": "$$c.duration",
              "lag": "$$c.lag",
              "courseType": "$$c.courseType",
              "scheduledStartDate": { "$cond": [{ "$ne": ["$$this", 0] }, "$$REMOVE", "$$c.scheduledStartDate"] },
              "scheduledEndDate": "$$c.scheduledEndDate",
              "scheduledEndDate": { "$cond": [{ "$ne": ["$$this", 0] }, "$$REMOVE", "$$c.scheduledEndDate"] },
              "transitionType": "$$c.transitionType"
            }
          }
        }
      }
    }
  }}
])

对于MongoDB 三点六

db.collection.aggregate([
  { "$addFields": {
    "courses": {
      "$map": {
        "input": { "$range": [0, { "$size": "$courses" }] },
        "in": {
          "$let": {
            "vars": { "c": { "$arrayElemAt": ["$courses", "$$this"] }},
            "in": {
              "$cond": [
                { "$eq": ["$$this", 0] },
                {
                  "stateName": "$$c.stateName",
                  "duration": "$$c.duration",
                  "lag": "$$c.lag",
                  "courseType": "$$c.courseType",
                  "scheduledStartDate": "$$c.scheduledStartDate",
                  "scheduledEndDate": "$$c.scheduledEndDate",
                  "stateName": "$$c.stateName",
                  "transitionType": "$$c.transitionType"
                },
                {
                  "stateName": "$$c.stateName",
                  "duration": "$$c.duration",
                  "lag": "$$c.lag",
                  "courseType": "$$c.courseType",
                  "transitionType": "$$c.transitionType"
                }
              ]
            }
          }
        }
      }
    }
  }}
])

哪个将 return

[
  {
    "_id": "1234",
    "completionStatus": "F",
    "courses": [
      {
        "courseProgress": 100,
        "courseType": "3",
        "duration": "5",
        "lag": "2",
        "scheduledEndDate": ISODate("2018-12-01T08:31:30Z"),
        "scheduledStartDate": ISODate("2018-11-27T08:31:30Z"),
        "stateName": "Stage 1",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "2",
        "duration": "60",
        "lag": "60",
        "stateName": "2nd stage",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "1",
        "duration": "5",
        "lag": "2",
        "stateName": "3rd Stage",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "1",
        "duration": 1,
        "lag": "10",
        "stateName": "4th stage",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "3",
        "duration": "1",
        "lag": "0",
        "stateName": "5th",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "3",
        "duration": "5",
        "lag": "5",
        "stateName": "6th",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "3",
        "duration": 1,
        "lag": "9",
        "stateName": "7th ",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "3",
        "duration": "66",
        "lag": 0,
        "stateName": "8th",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "1",
        "duration": "61",
        "lag": 0,
        "stateName": "9th",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "3",
        "duration": "80",
        "lag": 0,
        "stateName": "10th",
        "transitionType": "onAssignment"
      },
      {
        "courseType": "3",
        "duration": "8",
        "lag": 0,
        "stateName": "11th",
        "transitionType": "onAssignment"
      }
    ],
    "created": ISODate("2018-11-27T08:31:32.082Z"),
    "currentState": {
      "courseId": "116",
      "courseProgress": 100
    },
    "modified": ISODate("2018-11-27T08:31:32.082Z"),
    "userId": "23",
    "userStatus": 1
  }
]