Каким-то образом в моей базе данных есть документ без _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();
4. «Его можно вытащить, но нельзя сохранить или удалить». Как упоминалось выше, покажите свой код, как вы его извлекаете и как пытаетесь его редактировать/удалять. Также покажите свою схему.
Я не уверен, как сделать это воспроизводимым, если я вообще не знаю, как была создана запись. А что касается невозможности, то, очевидно, это не потому, что это каким-то образом произошло.
Может быть вы отключили _id через mongoose? Слова @aneroid имеют смысл, поскольку все документы в MongoDB должны быть связаны с _id
. Единственная возможность, о которой я могу думать, это то, что ваша схема является вложенным документом. Вложенный документ не может иметь _id в MongoDB.
Попробуйте получить этот документ с помощью mongosh или компаса, чтобы увидеть, как он на самом деле выглядит в базе данных.
Хорошо, я до сих пор понятия не имею, как был создан рассматриваемый документ, но мне удалось удалить его, просто выполнив следующее:
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. До сих пор не знаю, как это произошло, хотя думаю, что это могло произойти из-за дублирования данных.
1. Документ в коллекции без
_id
невозможен. Поднимите билет P1, если вы его каким-то образом создали. 2. Напишите «Если я попытаюсь удалить его с помощьюentry.delete()
» — сначала покажите свой код того, как вы получилиentry
. Покажите, что вы уже пробовали (код) в минимальном воспроизводимом примере. 3. ДляMongooseError: No _id found on document!
вы, вероятно, используете неправильную схему или неправильно ее определили. Ваши модели используютid
вместо_id
?