【问题标题】:How to delete related schema in mongodb using node js (mongoose)如何使用node js(mongoose)删除mongodb中的相关架构
【发布时间】:2021-11-12 04:23:48
【问题描述】:

我正在尝试删除在第一个架构中引用的第二个架构

ownerSchema.js

var ownerSchema = Schema({
    ownerId   : String,
    fname     : String,
    lname     : String,
    shopPlace : { 
                  type: Schema.Types.ObjectId,
                  ref: 'Shop'
                }
});
var Owner = mongoose.model('Owner', ownerSchema);

shopSchema.js

var shopSchema = Schema({
    _id       : String,
    shopName  : String,
    location  : String,
    startDate : Date,
    endDate   : Date
});
var Shop  = mongoose.model('Shop', shopSchema);

所以我试图删除我的第二个架构,但它只删除了第一个架构

const Owner = require("../models/ownerSchema");
const Shop = require("../models/shopSchema");

const deleteOnwerById = async (req, res) => {
  const { id } = req.params;
  let deletedShop = await Shop.deleteOne({_id:shopPlace}); // I can't delete my shop data
  let deletedTask = await Owner.deleteOne({ ownerId: id });
  } // I can delete owner but not shop detail
};

但它不会删除我的相关架构

【问题讨论】:

  • 好吧,Owner 架构没有 ownerId 字段。您正在尝试deleteOne({ ownerId: id }),必然没有任何文档匹配。
  • 实际上ownerSchema 有它自己的 ID,它的 _id 是默认出现的,我在这里也添加了我的 ownerId @JeremyThille
  • shopPlace 来自哪里?
  • 是的,你是在我第一次发表评论后添加的 :)
  • 但在你的例子中是undefined

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案1】:

首先,使用findByIdAndRemovefindOneAndDelete 删除您的所有者。这些方法允许您通过传递一个可选的options 对象来指定要从已删除文档中返回的一个或多个字段。

let deletedOwner = await Owner.findByIdAndRemove(ownerId, {projection : "shopPlace"});

然后使用所有者的shopPlace删除对应的shopPlace:

await Shop.deleteOne({_id:deletedOwner.shopPlace});

【讨论】:

  • 如果我想通过_id删除显示我将如何在这里给出或条件?
  • 因为我有ownerId,这是我给出的,但即使是mongodb也给出了默认的_id,所以我应该使用{_id : id || ownerid : id}还是如何使用?
  • 啊,你可以用{ $or : [ {_id:id} , {ownerId:id} ]}
  • 它显示Can't use $or@jeremy
  • 什么是“它”?代码是什么?另外,这是另一个问题,你应该在 Stackoverflow 上单独提问
【解决方案2】:

您必须首先从您的所有者的shopPlace 获取_id:

const Owner = require("../models/ownerSchema");
const Shop = require("../models/shopSchema");

const deleteOnwerById = async (req, res) => {
  const { id } = req.params;
  const owner = await Owner.findOne({ ownerId: id }).populate('shopPlace');
  let deletedShop = await Shop.deleteOne({ _id:owner.shopPlace._id });
  let deletedTask = await Owner.deleteOne({ ownerId: id });
  }
};

【讨论】:

  • 先删除 Owner 会返回被删除的文档。它包含shopPlace._id;你不需要先查询它,更不用说填充它
  • 刚刚考虑过,他要先撤店)
  • 但是为什么呢?没有理由要先删除一个。即使这样,也没有必要填充
  • 是的,顺便说一句,deleteOne 不返回文档
  • 啊废话,你说得对,我和原生 findOneAndDelete 混在一起了:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2021-12-20
  • 1970-01-01
  • 2020-02-21
  • 2019-09-30
  • 2021-08-14
相关资源
最近更新 更多