Почему истечение срока действия вложенного документа MongoDB удаляет родительский документ?

Я использую мангуст 5 и имею такие схемы:

user.js

const mongoose = require('mongoose');
const GeoData = require('./geodata');

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  createdAt: {
    type: Date,
    default: Date.now()
  },
  geodata: GeoData
});

UserSchema.index({ deviceToken: 1 }, { unique: true });

module.exports = UserSchema;

геоданные.js

const mongoose = require('mongoose');
const c2p = require('circle-to-polygon');

const GeoDataSchema = new mongoose.Schema({
  location: {
    coordinates: [Number],
    type: {
      type: String
    }
  },
  createdAt: {
    type: Date,
    default: Date.now()
  },
  expireAt: {
    type: Date,
    default: new Date().setHours(12,0,0,0)
  }
});

GeoDataSchema.index({ location: "2dsphere", bounds: "2dsphere" });
GeoDataSchema.index({ 'expireAt': 1 }, { expireAfterSeconds: 0 });

module.exports = GeoDataSchema;

Предположим, что вложенный документ geodata добавляется к родительскому документу user со сроком действия, установленным по умолчанию на 12:00:00 по местному времени. К сожалению, это удаляет родительский user с поддокументом geodata вместо удаления только geodata, как я ожидал.

Это нормальное поведение или я что-то упускаю?


person gutaker    schedule 19.06.2018    source источник


Ответы (1)


Индекс TTL всегда работает с корневым документом, а не с отдельными вложенными документами или другими частями документа.

Согласно документации:

Специальное свойство индекса TTL поддерживает реализацию коллекций TTL. Функция TTL использует фоновый поток в mongod, который считывает значения даты в индексе и удаляет просроченные документы из коллекции.

person dnickless    schedule 19.06.2018
comment
Спасибо, я пропустил слово documents. В любом случае было бы очень здорово, если бы это было реализовано в будущем. Теперь мне нужно написать задание cron для итерации и поиска устаревших документов или переместить geodata в его собственную коллекцию и добавить собственный индекс TTL. - person gutaker; 19.06.2018
comment
Вы могли бы подать запрос функции? - person dnickless; 19.06.2018
comment
Обязательно сделает! - person gutaker; 19.06.2018