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’ }] });

求:独立表怎样进行关联查询


5 回复

Node.js 多表关联查询怎么做?

背景介绍

假设我们有两个模型:AuthorBookAuthor 模型中有一个字段 books,用于存储该作者所写的所有书籍的引用(即 _id)。我们需要实现一个模糊查询,通过一个关键字 name_ 来查找与 BookAuthor 的名字匹配的数据。

独立表结构

首先,我们定义两个独立的表结构:

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));

解释

  1. 定义模型:我们定义了两个模型 AuthorBook,其中 Book 模型有一个 author 字段,指向 Author 模型。
  2. 创建正则表达式:我们使用 new RegExp(name_, 'i') 创建了一个忽略大小写的正则表达式。
  3. 查询书籍:我们使用 find 方法来查询 Book 表,并且通过 $or 进行多条件查询。我们查询 name 字段或 author 字段中的 name 字段是否匹配。
  4. 查询作者:我们同样使用 find 方法来查询 Author 表,仅通过 name 字段进行匹配。
  5. 结果返回:最后将查询到的 booksauthors 返回。

通过这种方式,我们可以轻松地在独立表结构中进行多表关联查询。


你使用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);
    });

解释

  1. 定义 Schema:

    • Author 模型有一个字段 name
    • Book 模型有两个字段:nameauthor(引用了 Author 模型)。
  2. 搜索并填充数据:

    • 使用 find() 方法来查找与关键字匹配的书籍。
    • 使用 .populate('author') 方法来填充书籍对应的作者信息。

这样,你就可以同时获取到符合条件的书籍及其对应的作者信息。如果你还需要进一步筛选作者信息,可以对 books 数组中的每个元素再次使用 populate 方法或单独查询 Author 集合。

回到顶部