仅删除与第二个表对应的第一个表中没有条目的那些

Posted

技术标签:

【中文标题】仅删除与第二个表对应的第一个表中没有条目的那些【英文标题】:Delete only those, which have no Entry in first table corresponding to the second table 【发布时间】:2019-02-28 14:51:59 【问题描述】:
var productSchema = Schema(
product_code: String,
name: 
    type: String,
    required: true
,
description: String,
category:
    type:  String,
    ref: 'Product_Category'
,
umo: String,
threshold: 
    type:Number,
    default: 0
,
image: String,
isactive: 
    type: Boolean,
    default: true

);

var product_categorySchema = Schema(
isactive: 
    type: Boolean,
    default: true
,
name: 
    type: String,
    required: true
,
description: String
);

我要从类别中删除这两个架构,但如果我在产品表中有与该类别对应的数据,则不应删除该类别。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

首先,请像这样更新产品架构中“类别”字段的“类型”属性:

category:
  type:  Schema.Types.ObjectId,
  ref: 'Category' // model name
`

并像这样声明模型:

var Product = mongoose.model('Product', productSchema );

然后使用“distinct”查询和“$nin”查询运算符删除产品架构未引用的类别,如下所示:

Product.find().distinct('category').then((data)=>
   Category.deleteMany(_id: $nin: data).then(del => 
       console.log("deleted",del)
   )
)

【讨论】:

【参考方案2】:

它应该看起来像这样:

     // Function which delete the category behind the given _id
     async function deleteCategory(idCategory) 
        // check if there is a product related to the category
        const ret = await product_schema.findOne(
          category: idCategory,
        );

        // if there is, return an error
        if (ret) throw new Error('Cannot delete the category');

        // else do delete the category
        return product_category_schema.remove(
          _id: idCategory,
        );
      

你也必须知道:

category:
    type:  String,
    ref: 'Product_Category'
,

不是设置参考的正确方法;它应该是 ObjectId 而不是 String

const 
  Schema,
 = mongoose;

category:
    type: Schema.Types.ObjectId,
    ref: 'Product_Category'
,

【讨论】:

您是在模式文件中还是在 nodeJS 端编写函数。因为曾尝试在架构中工作,但没有帮助 在 node.js 端

以上是关于仅删除与第二个表对应的第一个表中没有条目的那些的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Join 表与第一个表中的日期范围和第二个表中的日期

SQL GROUP BY/COUNT 即使没有结果

正则表达式删除与第二个字符串匹配的行?

MySQL 从具有重复引用条目的联合表中选择唯一记录

将基表值与第二个表的值之和与group by进行比较

将第二个表中的第二个(条件)结果添加到 SQL 查询