NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ рдХреИрд╕реЗ NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИ mongodb, arangodb, Oridb рдФрд░ rethinkdb (NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рдлреА рд╡рдлрд╛рджрд╛рд░ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХрдЬреБрдЯ рд╣реЛрддреЗ рд╣реИрдВ)ред рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, SQL JOIN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ CRUD рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ({...}) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд╕рд░реЗ рдореЗрдВ рдбрд╛рд▓реЗрдВ, ({...}), рдФрд░ рдореЗрдВ рддреАрд╕рд░рд╛ - рд╕реЗрд╡ ({...}), - рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЪрдпрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдПрдХ рд╣реА рдЪрдпрди рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП, рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ (рдХрдИ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдз) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд▓реЗрдЦрдХ

  • рдкрд╣рд▓рд╛ рдирд╛рдо

рдкреБрд╕реНрддрдХ

  • рдирд╛рдо

KnigiAvtorov

  • рд▓реЗрдЦрдХ
  • рдкреБрд╕реНрддрдХ

рдореЛрдВрдЧреЛрдбрдм рдХреЗ рд▓рд┐рдП, рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдЪрдпрди рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

const mongo = require('mongodb-bluebird'); mongo.connect("mongodb://localhost:27017/test").then(async function(db) { const author = db.collection('author'); const book = db.collection('book'); const bookauthor = db.collection('bookauthor'); ['Joe', 'John', 'Jack', 'Jeremy'].map(async (name) => await author.insert({name}) ); ['Art', 'Paint'].map(async (title) => await book.insert({title}) ); let Author = await author.findOne({ name: 'Joe' }); let Book = await book.findOne({ title: 'Paint' }); await bookauthor.insert({author: Author._id, book: Book._id}) Author = await author.findOne({ name: 'John' }); await bookauthor.insert({author: Author._id, book: Book._id}) Book = await book.findOne({ title: 'Art' }); await bookauthor.insert({author: Author._id, book: Book._id}) const result = await author.aggregate([{ $lookup:{ from: 'bookauthor', localField: '_id', foreignField: 'author', as: 'ba' }}, { $lookup: { from: 'book', localField: 'ba.book', foreignField: '_id', as: 'books' }}],{ }) }); 

SQL JOIN рдЪрдпрди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкрд░рд┐рдгрд╛рдореА рдЪрдпрди рдПрдХ рд╕рдорддрд▓ рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рдХрдИ рдкреБрд╕реНрддрдХреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╢реНрд░реЗрдгреАрдмрджреНрдз рд╡рд╕реНрддреБ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦрдХ рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрди рдХрд┐рддрд╛рдмреЛрдВ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдЧреА, рдЬрд┐рдирдореЗрдВ рдмреБрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред ред рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд▓рд╕ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ SQL JOIN рдХреЗ рд╕рдорд╛рди "рдлреНрд▓реИрдЯ" рд╕рдВрд╕реНрдХрд░рдг рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ "рд╡рд┐рд╕реНрддрд╛рд░" рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: { $unwind: '$books' } ред

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдирдореВрдирд╛ SQL LEFT JOIN рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕рднреА рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдирдореВрдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдЙрдирдХреЗ рдкрд╛рд╕ рдХрд┐рддрд╛рдмреЗрдВ рди рд╣реЛрдВред SQL [INNER] JOIN рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╢рд░реНрдд { $match: { books: { $ne: [ ] } } } , рдпрд╛ рдпрджрд┐ $ рдЦреЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рддреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 { $unwind: { path: "$role", preserveNullAndEmptyArrays: false } } 

рддреЛ, рдЪрд▓реЛ рдЖрд░рдВрдЧреЛрдбрдм рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЖрд░рдВрдЧреЛрдбрдм рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд░реЗрдЦрд╛рдВрдХрди рдирд╣реАрдВ):

  FOR a IN author FOR ba IN bookauthor FILTER a._id == ba.author FOR b IN book FILTER b._id == ba.book SORT a.name, b.title RETURN { author: a, book: b } 

рдЖрд░рдВрдЧреЛрдбрдм рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдирдореВрдирд╛ SQL [INNER] JOIN рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рдпрд╣ рдПрдХ "рдлреНрд▓реИрдЯ" рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдЦрд╛рд▓реА рдорд╛рди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ)

рд▓реЗрдХрд┐рди рдХрдИ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдл рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЖрд░рдВрдЧреЛрдбрдм рдореЗрдВ:

 const { Database, aql } = require('arangojs'); const db = new Database({ url: "http://localhost:8529" }); db.useDatabase("test"); db.useBasicAuth("test", "test"); const author = db.collection('author') const book = db.collection('book') const bookauthor = db.edgeCollection('bookauthor') void async function() { ['Joe', 'John', 'Jack', 'Jeremy'].map(async (name) => await author.save({name}) ); ['Art', 'Paint'].map(async (title) => await book.save({title}) ); let Author = await author.firstExample({ name: 'Joe' }); let Book = await book.firstExample({ title: 'Paint' }); await bookauthor.save({date: 'Some data'}, Author._id, Book._id) Author = await author.firstExample({ name: 'John' }); await bookauthor.save({date: 'Some data'}, Author._id, Book._id) Book = await book.firstExample({ title: 'Art' }); await bookauthor.save({date: 'Some data'}, Author._id, Book._id) const cursor = await db.query(aql` FOR a IN author FOR book_vertex, book_edge IN OUTBOUND a bookauthor COLLECT a1 = a INTO b1 RETURN {author: a1, books: b1[*].book_vertex} `); }(); 

рдЕрдм рд╣рдо рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреБрдХрдереЛрд░ рдХреЗ рдЧреНрд░рд╛рдл (рдХрд┐рдирд╛рд░реЗ) рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред IN OUTBOUND a bookauthor рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХрд╛ a рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ рдирд╛рдо book_vertex рддрд╣рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ book_vertex ред COLLECT a1 = a INTO b1 рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ COLLECT a1 = a INTO b1 SQL рдЧреНрд░реБрдк рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ - рдпрд╣ рдПрдХ рдПрд░реЗ рдореЗрдВ рдПрдХ рдорд╛рди рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдСрдерд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП b1 рдирд╛рдо рдХреЗ рддрд╣рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ a1 рдХреЗ рдирд╛рдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдирд┐рд░реНрдорд╛рдг b1[*].book_vertex рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрддрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЖрдЧреЗ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред

Arangodb рдореЗрдВ SQL LEFT JOIN рдЯрд╛рдЗрдк рдХреНрд╡реЗрд░реАрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЗ рд▓рд┐рдП - рдлрд╝рд┐рд▓реНрдЯрд░ рдХрдерди SQL [INNER] JOIN рдХреЗ рд╕рдорд╛рди рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИред "рдмрд╛рдПрдВ рдХрдиреЗрдХреНрд╢рди" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LET рдСрдкреЗрд░рд░реЗрдЯрд░ рдФрд░ рд╕рдмрдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  const cursor = await db.query(aql` FOR a IN author LET books = ( FOR book_vertex, book_edge IN OUTBOUND a bookauthor RETURN book_vertex ) RETURN {author: a, books} `); 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рдЧреНрд░реБрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╢реНрд░реЗрдгреА рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреБрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдЧреЙрдерд┐рдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред

Oridb рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЬрд╛рдПрдВред рдпрд╣ рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдбреЗрдЯрд╛рдмреЗрд╕ рднреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ рдЧреНрд░рд╛рдлрд╝ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдЖрд░рдВрдЧреЛрдбрдм рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣реА рд╣реИ, рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреБрдХрдереЛрд░ рдЧреНрд░рд╛рдл рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 const OrientDB = require('orientjs'); const server = OrientDB({ host: 'localhost', port: 2424, }); void async function() { const db = server.use({ name:'test', username: 'test', password: 'test' }); await db.open(); try { await db.class.drop('Author UNSAFE'); } catch(ex) { console.log(ex) } try { await db.class.drop('Book UNSAFE'); } catch(ex) { console.log(ex) } try { await db.class.drop('BookAuthor UNSAFE'); } catch(ex) { console.log(ex) } const author = await db.class.create('Author', 'V'); const book = await db.class.create('Book', 'V'); const bookauthor = await db.class.create('BookAuthor', 'E'); ['Joe', 'John', 'Jack', 'Jeremy'].map(async (name) => await author.create({name}) ); ['Art', 'Paint'].map(async (title) => await book.create({title}) ); await author.list(); await book.list(); let Author = await db.select().from('Author').where({name: 'Joe'}).one(); let Book = await db.select().from('book').where({ title: 'Paint' }).one(); await db.create('EDGE', 'BookAuthor').from(Author['@rid']).to(Book['@rid']).set({date: 'Some data'}).one(); Author = await db.select().from('Author').where({name: 'John'}).one(); await db.create('EDGE', 'BookAuthor').from(Author['@rid']).to(Book['@rid']).set({date: 'Some data'}).one(); Book = await db.select().from('book').where({ title: 'Art' }).one(); await db.create('EDGE', 'BookAuthor').from(Author['@rid']).to(Book['@rid']).set({date: 'Some data'}).one(); const cursor = await db.query(`select name, out('BookAuthor').title as books from Author`).all() } () 

рд╢рд╛рдпрдж рдУрд░рд┐рдПрдбрдм рдХреЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рдлрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ SQL рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИ рдФрд░ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╢рди out('BookAuthor').title as books from Author рдЕрд░реНрде рдСрдерд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдЪрдпрди рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдмреБрдХрдСрдЙрдереЛрд░ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╕рднреА рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рд▓реЗрдЦрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреБрд╕реНрддрдХ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдореА рд╡рд╕реНрддреБ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдХ рд╣реЛрдЧреА (рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдмреБрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рд╣реИ)ред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╕рдорддрд▓ рд╡рд╕реНрддреБ рдореЗрдВ рд╕рд░рдгреА рдХреЛ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ UNWIND рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЯреАрдо рдореМрдЬреВрдж рдирд╣реАрдВ рдереА рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЦреБрд▓реЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдореИрдВ рдЗрд╕реЗ рддреБрд░рдВрдд рдХрд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рдЦрдмрд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкрд░рд┐рдЪрд┐рдд рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ rethinkdb рдореЗрдВ JOIN рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд╛ред рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрд╡рд╕рд░ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рддреБрд░рдВрдд рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреБрдбрд╝рдиреЗ () рдХреЛ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд░рд╕рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛рдкрди рд░рдЦрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рд╡рд╣реА рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЙрджрд╛рд╣рд░рдг рдЕрдм рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 r = require('rethinkdb') void async function() { const conn = await r.connect({ host: 'localhost', port: 28015 }); try { await r.db('test').tableDrop('author').run(conn); await r.db('test').tableDrop('book').run(conn); await r.db('test').tableDrop('bookauthor').run(conn); } catch (ex) { console.log(ex) } await r.db('test').tableCreate('author').run(conn); await r.db('test').tableCreate('book').run(conn); await r.db('test').tableCreate('bookauthor').run(conn); await r.db('test').table('bookauthor').indexCreate('author').run(conn); await r.db('test').table('bookauthor').indexCreate('book').run(conn); await r.db('test').table('bookauthor').indexWait('author', 'book').run(conn); ['Joe', 'John', 'Jack', 'Jeremy'].map(async (name) => await r.db('test').table('author').insert({ name }).run(conn) ); ['Art', 'Paint'].map(async (title) => await r.db('test').table('book').insert({ title }).run(conn) ); let Author = await r.db('test').table('author').filter({ name: 'Joe' }).run(conn).then(authors => authors.next()); let Book = await r.db('test').table('book').filter({ title: 'Paint' }).run(conn).then(books => books.next()); await r.db('test').table('bookauthor').insert({author: Author.id, book: Book.id}).run(conn); Author = await r.db('test').table('author').filter({ name: 'John' }).run(conn).then(authors => authors.next()); await r.db('test').table('bookauthor').insert({author: Author.id, book: Book.id}).run(conn); Book = await r.db('test').table('book').filter({ title: 'Art' }).run(conn).then(books => books.next()); await r.db('test').table('bookauthor').insert({author: Author.id, book: Book.id}).run(conn); const cursor = await r.db('test').table('author') .eqJoin('id', r.db('test').table('bookauthor'), {index: 'author'}).zip() .eqJoin('book', r.db('test').table('book')).zip().run(conn); }(); 

рдЖрдкрдХреЛ рдРрд╕реЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, eJJoin () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдзреНрдпрдорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЬреЛрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдпрд╛ рдорд╛рдзреНрдпрдорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА (рд▓реЗрдХрд┐рди рдорд╛рдзреНрдпрдорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдорд╛рдзреНрдпрдорд┐рдХ рдХреБрдВрдЬреА рдирд╣реАрдВ)ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдЪрд┐рддреНрд░ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдЖрджреЗрд╢ рд╣реИред рдЬреЛрдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ, рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рдЧрдгрдирд╛ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИ)ред

рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкрд╛рда рднрдВрдбрд╛рд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ ред

apapacy@gmail.com
4 рдЬреВрди, 2018

Source: https://habr.com/ru/post/hi413123/


All Articles