Nodejs 多表关联查询怎么做?
Nodejs 多表关联查询怎么做?
本人是菜鸟,练习的时候遇到了一个问题, 假如我有两张表,Author和Book,现在我想做一下模糊查询,通过一个关键字name_ 来查找Book的name like name_ 或者Book.Author.name like name_
对于嵌入式的文档模型关系我可以这么做: var User = mongoose.Schame({ name :String , author : { name :String } }); var reg = new Regex(name_ , ‘g’); User.find({$or:{name : reg,author.name :reg}}).exec();
但是为了独立表结构,实际ref模型如下: var User = mongoose.Schame({ name :String , author : { type :ObjectId, ref :‘author’ } }); var Author = mongoose.Schame({ name : String , books : [{ type : ObjectId , ref :‘book’ }] });
求:独立表怎样进行关联查询
Node.js 多表关联查询怎么做?
背景介绍
假设我们有两个模型:Author
和 Book
。Author
模型中有一个字段 books
,用于存储该作者所写的所有书籍的引用(即 _id
)。我们需要实现一个模糊查询,通过一个关键字 name_
来查找与 Book
或 Author
的名字匹配的数据。
独立表结构
首先,我们定义两个独立的表结构:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 定义 Author 模型
const AuthorSchema = new Schema({
name: String,
books: [{ type: Schema.Types.ObjectId, ref: 'Book' }]
});
const Author = mongoose.model('Author', AuthorSchema);
// 定义 Book 模型
const BookSchema = new Schema({
name: String,
author: { type: Schema.Types.ObjectId, ref: 'Author' }
});
const Book = mongoose.model('Book', BookSchema);
关联查询
我们可以使用 Mongoose 提供的查询方法来进行关联查询。以下是一个示例代码,演示如何通过 name_
进行模糊查询:
async function searchBooksAndAuthors(name_) {
const regex = new RegExp(name_, 'i'); // 忽略大小写
// 查询所有 Book 名字或 Author 名字匹配的数据
const books = await Book.find({
$or: [
{ name: regex },
{ author: { $elemMatch: { name: regex } } }
]
}).populate('author');
// 查询所有 Author 名字匹配的数据
const authors = await Author.find({
name: regex
});
return { books, authors };
}
// 使用示例
searchBooksAndAuthors('example')
.then(result => console.log(result))
.catch(err => console.error(err));
解释
- 定义模型:我们定义了两个模型
Author
和Book
,其中Book
模型有一个author
字段,指向Author
模型。 - 创建正则表达式:我们使用
new RegExp(name_, 'i')
创建了一个忽略大小写的正则表达式。 - 查询书籍:我们使用
find
方法来查询Book
表,并且通过$or
进行多条件查询。我们查询name
字段或author
字段中的name
字段是否匹配。 - 查询作者:我们同样使用
find
方法来查询Author
表,仅通过name
字段进行匹配。 - 结果返回:最后将查询到的
books
和authors
返回。
通过这种方式,我们可以轻松地在独立表结构中进行多表关联查询。
你使用API中的populate
方法试一试,我没数据库,所以你自己try一下,需要时call我2426960129
意思是populate之后手动对记录进行过滤么? Book.find().select(‘name author author.name’).populate({path:‘author’}).exec(过滤);
扫表了。。。 这种情况下遇到分页怎么办啊
貌似可以用$elemMatch ,下班回家试试
对于独立表结构中的多表关联查询,可以使用 Mongoose 的 populate
方法来实现。下面我将展示如何通过一个关键字 name_
来模糊查询 Book
表和 Author
表。
示例代码
首先定义两个模型:
const mongoose = require('mongoose');
const AuthorSchema = new mongoose.Schema({
name: { type: String, required: true }
});
const BookSchema = new mongoose.Schema({
name: { type: String, required: true },
author: { type: mongoose.Schema.Types.ObjectId, ref: 'Author' }
});
const Author = mongoose.model('Author', AuthorSchema);
const Book = mongoose.model('Book', BookSchema);
接下来,我们编写一个函数来执行模糊查询:
async function searchBooksAndAuthors(name_) {
const reg = new RegExp(name_, 'i'); // 忽略大小写
// 查找包含匹配关键字的书籍
const books = await Book.find({ name: reg })
.populate('author'); // 填充作者信息
return books;
}
// 使用方法
searchBooksAndAuthors('key')
.then(books => {
console.log(books);
})
.catch(err => {
console.error(err);
});
解释
-
定义 Schema:
Author
模型有一个字段name
。Book
模型有两个字段:name
和author
(引用了Author
模型)。
-
搜索并填充数据:
- 使用
find()
方法来查找与关键字匹配的书籍。 - 使用
.populate('author')
方法来填充书籍对应的作者信息。
- 使用
这样,你就可以同时获取到符合条件的书籍及其对应的作者信息。如果你还需要进一步筛选作者信息,可以对 books
数组中的每个元素再次使用 populate
方法或单独查询 Author
集合。