Как удалить выбранный массив документов в mongo

#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 } })»