Удалить недавний объект из встроенного документа? - PullRequest
0 голосов
/ 09 июля 2020

Я использую mon goose и node js для разработки. Я хочу $pull недавний объект из встроенных документов spas.

Вот мои образцы данных. Пожалуйста, помогите мне создать запрос mongodb.

{
    "_id" : ObjectId("5f071322c89b0e2a7c35a25a"),
    "totalPrice" : 0,
    "user" : ObjectId("5ee096ee7febd3408828ce2c"),
    "type" : "SpaService",
    "spas" : [
        {
            "price" : 0,
            "_id" : ObjectId("5f071322c89b0e2a7c35a25b"),
            "categoryId" : ObjectId("5ebbfd29b117f50dac1039e2"),
            "serviceId" : ObjectId("5ebbfd29b117f50dac1039e3"),
            "duration" : 60
        },
        {
            "price" : 0,
            "_id" : ObjectId("5f071328c89b0e2a7c35a25c"),
            "categoryId" : ObjectId("5ebbfd29b117f50dac1039e2"),
            "serviceId" : ObjectId("5ebbfd29b117f50dac1039e3"),
            "duration" : 60
        },
        {
            "price" : 0,
            "_id" : ObjectId("5f071363c89b0e2a7c35a25d"),
            "categoryId" : ObjectId("5ebbfd29b117f50dac1039e2"),
            "serviceId" : ObjectId("5ebbfd29b117f50dac1039e3"),
            "duration" : 30
        }
    ],
    "listingId" : ObjectId("5ebbf95fb117f50dac1039d1")
}

В этом примере у меня есть 3 object в spas, и я хочу вытащить недавний _id, чей duration равен 60. Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 19 июля 2020

Если вы используете MongoDB v4.2 или новее, вы можете использовать update с конвейером агрегации , где вы можете использовать $reduce, чтобы найти последний _id, который имеет продолжительность 60. Затем примените $ фильтр, чтобы удалить элемент с этим _id.

db.collection.update({/* your update condition */ }, [
  {
    $set: {
      spas: {
        $filter: { // 2. use filter to keep elements that has _id that is not equal to the _id we found
          input: "$spas",
          cond: {
            $ne: [
              "$$this._id",
              {
                $reduce: { // 1. find the element with the latest _id and has duration 60
                  input: "$spas",
                  initialValue: null,
                  in: {
                    $cond: [
                      {
                        $and: [
                          { $eq: ["$$this.duration", 60] },
                          { $gt: ["$$this._id", "$$value"] }
                        ]
                      },
                      "$$this._id",
                      "$$value"
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Пн go Детская площадка

...