#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
Мне пришлось найти хранилища, чтобы удалить их идентификаторы из своих членов, поэтому я их выбрал, и я думаю, что не стоит использовать один и тот же запрос с deleteMany.вот мой код:
async function deleteStores() {
const stores = await Store.find({
$or: [
{ deleteDate: { $exists: true, $gt: Date.now() } },
{ expires: { $gt: Date.now() 30 * 24 * 60 * 60 * 1000 } },
],
}).populate("members");
const memberIds = [];
stores.forEach((store) => {
memberIds.push(...store.members.map((m) => m.account));
});
const storeIds = stores.map((s) => s.id);
await Account.updateMany(
{ _id: { $in: memberIds } },
{ $pull: { stores: { $in: storeIds } } }
);
// what shall I do here to delete "stores"?
}
Я новичок в mongodb, пожалуйста, не стесняйтесь улучшать мой код.
// here are my schemas
const storeSchema = new Schema({
// ... some other stuff
members: [memberSchema],
expires: { type: Date, default: () => Date.now() 15 * 24 * 60 * 60 * 1000 },
deleteDate: Date,
});
const memberSchema = new Schema({
account: { type: Schema.Types.ObjectId, ref: "Account" },
memberType: { type: Number, enum: Object.values(MemberType), default: 3 }, // MemberType
access: [{ type: String, enum: Object.values(MemberAccess) }], // MemberAccess
});
const AccountSchema = new Schema({
// ... some other stuff
stores: [{ type: Schema.Types.ObjectId, ref: "Store" }],
});
Ответ №1:
Я думаю, что ваш код почти в порядке, после того, как вы извлекли идентификаторы хранилища из учетных записей, вы должны удалить хранилища по идентификаторам:
await Store.deleteMany({ _id: { $in: storeIds } })
Как я вижу, вы используете Mongoose, поэтому вы не должны использовать _id
в своем коде id
. Если ваш код не удаляет store
ссылки из учетных записей, вот почему я думаю.
В вашем коде у вас есть несколько forEach
хранилищ для сбора идентификаторов участников, и после того, как вы сопоставите идентификаторы хранилища, я думаю, что более оптимально собирать идентификаторы хранилища forEach
и в этом:
const accountIds = [];
const storeIds = [];
stores.forEach((store) => {
storeIds.push(store._id);
accountIds.push(...store.members.map((m) => m.account));
});
Я должен переименовать memberIds
в accountIds
, потому что это набор идентификаторов учетных записей (не член), это может немного сбить с толку.
Комментарии:
1. Спасибо, я просто хотел узнать, нормально ли иметь эту строку кода в конце «await Store.deleteMany({ _id: { $in: storeIds } })»