代码之家  ›  专栏  ›  技术社区  ›  Ramazan Chasygov

MongoDB,正确设置一对多、多对一关系方法

  •  0
  • Ramazan Chasygov  · 技术社区  · 6 年前

    我正在尝试正确地设置一对一、多对一关系方法,到目前为止,我的结果是(下面的伪代码)。我使用的是Typegoose(基本上就是Mongoose和类型),如果你以前从未使用过它,那就没什么好担心的了,反正这是关于架构的。我想讨论“createBook”方法,正如你所看到的,我按顺序使用“wait,wait”,这使得它非常低效,我可以使用承诺,并在方法的末尾编写 Promise.all(bookQuery, authorQuery)

    class Author extends Typegoose {
      @prop()
      fullName: string;
    
      @prop({ ref: Book, default: [] })
      books: Ref<Book>[];
    }
    
    class Book extends Typegoose {
      @prop()
      title: string;
    
      @prop({ ref: Author })
      author: Ref<Author>;
    }
    
    async createBook(title, authorId): Promise<Book> {
        const book = await new this.bookRepository({
          title,
          author: ObjectId(authorId)
        }).save();
    
        await this.authorRepository.updateOne(
          { _id: authorId },
          { $push: { books: Types.ObjectId(book.id) } }
        );
    
        return book;
      }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Gor Kotikyan    6 年前

    第一条路是这样的

    async createBook(title, authorId): Promise<Book> {
      const book = new this.bookRepository({
        title,
        author: ObjectId(authorId)
      }).save();
    
      const author = this.authorRepository.updateOne(
        { _id: authorId },
        { $push: { books: Types.ObjectId(book.id) } }
      );
      try {
        await Promise.all([book, author])
        return book;
      } catch (e) {
        console.log(e)
        await Promise.all([
          this.bookRepository.deleteOne({_id: book._id}),
          this.authorRepository.updateOne(
            { _id: authorId },
            { $pull: { books: Types.ObjectId(book.id) } 
          }
        )]
      }
    }

    第二种方法是使用 MongoDB Transactions . 但是,它来自Mongo4.0版本,仅在副本集上使用。此外,从4.2版开始的事务也将在分片集合上可用