Как удалить или отредактировать документ mongodb без _id?

Каким-то образом в моей базе данных есть документ без _id. Его можно вытащить, но нельзя сохранить или удалить. Документ выглядит примерно так:

{
  name: 'John Smith',
  key: 'abc123',
  data: [
    'Lorem ipsum',
    'dolor sic amet'
  ]
}

И моя схема выглядит следующим образом:

personSchema  = mongoose.Schema({
    name: String,
    data: { type: Array },
    key: String
})

Обратите внимание: поле key полностью отделено от id и используется внутри, а все остальные документы в коллекции имеют поле _id.

Следующий код выдает ошибку UnhandledPromiseRejectionWarning: MongooseError: No _id found on document!:

personSchema  = mongoose.Schema({
    name: String,
    data: { type: Array },
    key: String
});
Person = mongoose.model('entries', personSchema);
let entries = await Person.find({key: "abc123"});
let toDelete;
entries.forEach(entry => {
    if (!entry._id){
        toDelete = entry;
    }
});
toDelete.delete();

1. Документ в коллекции без _id невозможен. Поднимите билет P1, если вы его каким-то образом создали. 2. Напишите «Если я попытаюсь удалить его с помощью entry.delete()» — сначала покажите свой код того, как вы получили entry. Покажите, что вы уже пробовали (код) в минимальном воспроизводимом примере. 3. Для MongooseError: No _id found on document! вы, вероятно, используете неправильную схему или неправильно ее определили. Ваши модели используют id вместо _id?

aneroid 19.04.2024 00:15

4. «Его можно вытащить, но нельзя сохранить или удалить». Как упоминалось выше, покажите свой код, как вы его извлекаете и как пытаетесь его редактировать/удалять. Также покажите свою схему.

aneroid 19.04.2024 00:17

Я не уверен, как сделать это воспроизводимым, если я вообще не знаю, как была создана запись. А что касается невозможности, то, очевидно, это не потому, что это каким-то образом произошло.

Nicolas Budig 19.04.2024 00:49

Может быть вы отключили _id через mongoose? Слова @aneroid имеют смысл, поскольку все документы в MongoDB должны быть связаны с _id. Единственная возможность, о которой я могу думать, это то, что ваша схема является вложенным документом. Вложенный документ не может иметь _id в MongoDB.

ray 19.04.2024 01:06

Попробуйте получить этот документ с помощью mongosh или компаса, чтобы увидеть, как он на самом деле выглядит в базе данных.

Joe 19.04.2024 02:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, я до сих пор понятия не имею, как был создан рассматриваемый документ, но мне удалось удалить его, просто выполнив следующее:

personSchema  = mongoose.Schema({
    name: String,
    data: { type: Array },
    key: String
});
Person = mongoose.model('entries', personSchema);
await Person.deleteOne({key: "abc123"});

А затем проверяем, что правильная запись была удалена.

Ответ принят как подходящий

Ваш .delete() асинхронен, но вы не обрабатываете его как асинхронный. Вместо этого используйте .deleteOne().

const mongoose = require('mongoose');
const personSchema = mongoose.Schema({
    name: String,
    data: { type: Array },
    key: String
});

const Person = mongoose.model('entries', personSchema);

async function deleteEntry() {
    try {
        let entries = await Person.find({ key: "abc123" });
        let toDelete;

        entries.forEach(entry => {
            if (!entry._id) {
                toDelete = entry;
            }
        });

        if (toDelete) {
            await toDelete.deleteOne();
        } else {
            console.info("No document found without an _id or all documents have an _id.");
        }
    } catch (error) {
        console.error("An error occurred:", error);
    }
}

deleteEntry();

Примечание: можно создавать документы без _id. Но я не думаю, что это то, что происходит в вашей ситуации.

const childSchema = new Schema({
  name: String
}, { _id: false });

const parentSchema = new Schema({
  children: [childSchema],
  familyName: String
});

const ParentModel = mongoose.model('Parent', parentSchema);

Родительский документ будет иметь _id, а дочерний документ — нет.

Это сработало, как упоминалось в моем собственном ответе. И да, мне каким-то образом удалось получить родительскую схему без _id. До сих пор не знаю, как это произошло, хотя думаю, что это могло произойти из-за дублирования данных.

Nicolas Budig 19.04.2024 19:25

Другие вопросы по теме