mongoose的表的关联

最近在学习node的时候在建表时,发现这个表需要储存另一个表的信息,然后一个表可能会与多个表之间产生联系,这让我很头大,所以便去搜索了一番,结果是我还没学到表之间的关联

以下则是我学到的通过node的mongoose来实现对mongoDb数据库的表的关联

mongoose表的关联查询

使用aggregate

xxx.aggregate([{
    $lookup:{
    	from:
        localfiled:
        foreignFiled:
        as:
}
}],callback)

from表示哪个表与本表关联

localFiled表示依据本表的哪个属性值去用

foreignFiled表示与上面相匹配的值所对应的信息

as表示最终结果储存在该变量里面

如果要与多个表关联,直接写多个lookup

使用populate

首先需要在创建shcema的时候声明哪个是需要关联查询的

并在后面追加ref

例如

我的User表里面会储存cart的id则这样写

cart_id:{
        type:Schema.Types.ObjectId,
        ref:"Cart",
        required:true,
        default:""
    }

当我们查询时

则使用

User.find({}).populate(cart_id).exec(function(err,suc){
    console.log(err);
})

populate里面的参数是该model所关联的信息,例如上面所说的cart_id

这两个方法都可以实现表之间的关联

但是也有不同点

aggregate会在返回数据时额外生成一个变量来储存关联的信息,

populate则是把关联字段直接替换成得到的关联信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mongoose 中进行多关联删除,需要使用到 Mongoose 的 middleware 中的 pre 钩子函数进行操作。假设我们有两个模型: User 和 Post,User 模型中有一个数组类型的属性 posts,存储该用户发的所有文章的 _id。我们需要在删除某篇文章时,同时将该文章的 _id 从用户的 posts 数组中删除。 代码实现如下: ```javascript const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: { type: String, required: true }, posts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }] }); const PostSchema = new mongoose.Schema({ title: { type: String, required: true }, content: { type: String, required: true } }); // 在 Post 模型中定义删除文章前的操作 PostSchema.pre('remove', function(next) { const post = this; // 从 User 模型中删除该文章的 _id mongoose.model('User').updateMany({ posts: post._id }, { $pull: { posts: post._id } }, next); }); const User = mongoose.model('User', UserSchema); const Post = mongoose.model('Post', PostSchema); // 删除一篇文章 Post.findOne({ title: '要删除的文章标题' }, function(err, post) { if (err) { console.log(err); } else { post.remove(); } }); ``` 在 Post 模型中,我们使用 pre('remove', function(next) {}) 定义了删除文章前的操作。在该操作中,我们首先获取即将删除的文章 post,然后通过 mongoose.model('User').updateMany() 删除 User 模型中所有 posts 数组中包含该文章 _id 的元素。其中,$pull 操作符示从数组中删除指定元素。 需要注意的是,我们在 User 模型的 posts 属性中使用了 ref 关联到了 Post 模型,这样才能在删除文章时找到所有包含该文章 _id 的 User,从而进行删除操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值