2017-02-13 20 views
2

От предыдущей работы по CouchDB 1.6.1, я знаю, что это возможно реализовать документ присоединяется пара способов:Можете ли вы реализовать объединение документов с использованием CouchDB 2.0 'Mango'?

Например, с помощью простой схемы «студентов and 'courses:

// Students table 
| Student ID | Student Name 
| XYZ1  | Zach 

// Courses table 
| Course ID | Student ID 
| COURSE1 | XYZ1 

Это SQL запрос:

SELECT [Student Name], [Course ID] FROM Students RIGHT OUTER JOIN Courses ON Students.[Student ID] = Courses.[Student ID] 

Может быть реализован в CouchDB 1.6 с функцией отображения:

// Map function 
function(doc){ 
    if (doc.type == 'Course') emit(doc["Student ID"], doc); 
    if (doc.type == 'Student') emit(doc["Student ID"], doc) 
} 

И как группа и уменьшить функции

// Group would produce: 
Student ID: [{course doc}, {student doc}, {course doc}, etc] 

// Reduce would allow you to then process student and course docs for a single ID (with CouchDB protesting about expanding view indexes) 

Или вы можете использовать функцию List перебирать либо сгруппированный или разгруппирован индекс карты.

Рассматривая документацию для Mango here, упоминается, что _find (который я предполагаю - это конечная точка Манго) использует индексы. Я не вижу способа сказать «где поле равно другое поле», но тогда я не очень хорошо знаком с манго на все ...

Вопрос:

  1. Могут ли вы «Подражать» документ присоединяется к Mango?
  2. Если вы можете, это было бы лучше или хуже, чем использование MapReduce для выполнения того же самого?

ответ

1

Я думаю, вы уже поняли это, но для записей: вы можете использовать селекторы равенства и поместить их в оператор OR.

запрос должен быть чем-то похожим, что:

{"studentId": "SOMEID" } 
{"$or": [{"type": {"$eq": "Student"}}, {"type": {"$eq": "Course"}}]} 

Это, как говорится, вы, кажется, пытаются работать с сырыми реляционными данными в CouchBb. Как я всегда говорю, вы не можете просто сбрасывать реляционные данные в CouchDb и рассчитывать на счастливую жизнь. Возможно, вам стоит рассмотреть возможность превратить ваши реляционные данные в объекты богатого домена, прежде чем хранить их в CouchDb.

+0

В этом случае мои реляционные данные имеют непоследовательные схемы. Например, если у меня есть объект под названием «Книги», данные поступают из 10 разных книжных магазинов. поэтому в каждом книжном магазине есть строки, которые являются книгами, но столбцы имеют разные имена. Мое намерение состоит в том, чтобы соскрести все «книги» в «Кушетка», а затем создать представление, которое «выравнивает» все строки книг в единый объект. Как вы относитесь к этому? –

+0

Итак, если я правильно понимаю, сущность 'Books' сначала не плоская, это« нормальная »вложенная структура. Как вы собираетесь запрашивать данные? знаете ли вы типы книг, которые вы будете получать во время запроса? (В принципе, мне нужно знать, чего вы пытаетесь достичь, поскольку есть несколько способов сделать это) – reddy

+0

Я понимаю, что это не может быть напрямую связано с вашим первоначальным вопросом, не могли бы вы создать другой вопрос и связать его с вот так у нас больше пространства и контекста, чтобы обсудить это. – reddy