MongoDB и "присоединяется"

Я уверен, что MongoDB официально не поддерживает "присоединяется". Что это значит?

Означает ли это: "Мы не можем соединить две коллекции (таблицы) вместе."?

Я думаю, если мы поместим значение для _id в коллекцию A в other_id в коллекции B, можем ли мы просто соединить две коллекции?

Если мое понимание верное, MongoDB может соединять две таблицы вместе, скажем, при запуске запроса. Это делается "Ссылка", написанная в http://www.mongodb.org/display/DOCS/Schema+Design.

Тогда что означает "присоединяется"?

Мне бы хотелось узнать ответ, потому что это важно для изучения схемы схемы MongoDB. http://www.mongodb.org/display/DOCS/Schema+Design

Ответ 1

Это не соединение, так как отношения будут оцениваться только тогда, когда это необходимо. Соединение (в базе данных SQL), с другой стороны, будет разрешать отношения и возвращать их, как если бы они были одной таблицей (вы "объединяете две таблицы в одну" ).

Вы можете узнать больше о DBRef здесь: http://docs.mongodb.org/manual/applications/database-references/

Существует два возможных решения для разрешения ссылок. Один из них - сделать это вручную, как вы уже почти описали. Просто сохраните документ _id в другом документе other_id, а затем напишите свою собственную функцию для разрешения отношений. Другим решением является использование DBRefs, как описано на странице руководства выше, что заставит MongoDB разрешать отношения клиентской стороны по требованию. Решение, которое вы выбрали, не имеет большого значения, поскольку оба метода разрешают отношения на стороне клиента (обратите внимание, что база данных SQL разрешает соединения на стороне сервера).

Ответ 2

Как и в случае с Mongo 3.2, ответ на этот вопрос уже не верен. Новый оператор $lookup, добавленный в конвейер агрегации, по существу идентичен левому внешнему соединению:

https://docs.mongodb.org/master/reference/operator/aggregation/lookup/#pipe._S_lookup

Из документов:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

Ответ 3

База данных не выполняет объединение - или автоматическое "связывание" между документами. Однако вы можете сделать это самостоятельно на стороне клиента. Если вам нужно сделать 2, это нормально, но если вам нужно сделать 2000, количество оборотов клиент/сервер сделает операцию медленной.

В MongoDB используется общий шаблон. В отношениях, когда нормализация вещей разбивается на части. Часто в mongo эти части в конечном итоге являются единым документом, поэтому в любом случае соединение не требуется. Но когда нужно, клиент делает это на стороне клиента.

Рассмотрим классический пример ORDER-LINEITEM. Один заказ и 8 позиций - 9 строк в реляционном; в MongoDB мы обычно просто моделируем это как единый документ BSON, который является порядком с массивом встроенных позиций. Поэтому в этом случае вопрос о присоединении не возникает. Однако в заказе должен быть ЗАКАЗЧИК, который, вероятно, является отдельной коллекцией - клиент может прочитать cust_id из документа заказа, а затем перейти к нему по мере необходимости отдельно.

Есть несколько видеороликов и слайдов для обсуждения дизайна схемы на веб-сайте mongodb.org. Я верю.

Ответ 4

один вид соединения запроса в mongoDB, запрашивается в одной коллекции для идентификатора, который соответствует, помещает идентификаторы в список (список idlist) и находит использование в другой (или такой же) коллекции с помощью $in: idlist

u = db.friends.find({"friends": something }).toArray()
idlist= []
u.forEach(function(myDoc) { idlist.push(myDoc.id ); } )
db.family.find({"id": {$in : idlist} } )

Ответ 5

Первый пример, на который вы ссылаетесь, показывает, как ссылки MongoDB ведут себя как ленивая загрузка, а не как объединение. Там нет запроса, который происходит в обеих коллекциях, вместо этого вы запрашиваете одно, а затем просматриваете элементы из другой коллекции по ссылке.

Ответ 6

Тот факт, что mongoDB не является реляционным, привел некоторые люди считают это бесполезным. Я думаю, что вы должны знать, что вы делаете, прежде чем создавать БД. Если вы решите использовать noSQL DB, такую ​​как MongoDB, лучше реализовать схему. Это сделает ваши коллекции более или менее похожими на таблицы в SQL-базах данных. Кроме того, избегайте денормализации (внедрения), если это необходимо по соображениям эффективности.

Если вы хотите создать свою собственную базу данных noSQL, я предлагаю посмотреть документацию Firebase. Если вы понимаете, как они организуют данные для своего сервиса, вы можете легко создать аналогичный шаблон для своих.

Как указывали другие, вам нужно будет сделать соединение на стороне клиента, за исключением Meteor (структура Javascript), вы можете подключиться к серверу с этим пакетом (я не знаю других фреймворков, которые позволяют это сделать). Тем не менее, я предлагаю вам прочитать эту статью статью, прежде чем решиться пойти с этим выбором.

Изменить 28.04.17: Недавно Firebase опубликовала эту по разработке баз данных noSql. Они также подчеркнули в один из эпизодов причины, чтобы избежать объединения и как обойти такие сценарии, денормализуя вашу базу данных.

Ответ 7

Рассмотрим использование мангуста? Это дает вам возможность делать соединения с данными mongo.

Ответ 8

Если вы используете мангуст, вы можете просто использовать (при условии, что вы используете поддокументы и население):

Profile.findById profileId
  .select 'friends'
  .exec (err, profile) ->
    if err or not profile
      handleError err, profile, res
    else
      Status.find { profile: { $in: profile.friends } }, (err, statuses) ->
        if err
          handleErr err, statuses, res
        else
          res.json createJSON statuses

Он извлекает Statuses, которые принадлежат одному из друзей Profile (profileId). Друзья - это массив ссылок на другие Profiles. Profile с friends определяется:

schema = new mongoose.Schema
  # ...

  friends: [
    type: mongoose.Schema.Types.ObjectId
    ref: 'Profile'
    unique: true
    index: true
  ]

Ответ 9

вы можете использовать MongoDB-аддоны, сглаживать и разрешать объединение, слияние и создание буфера запросов попробуй: https://github.com/petersirka/mongodb-addons

Ответ 10

Являясь пользователем MongoDB самостоятельно, мне приходилось довольно часто получать данные из соответствующих сборников. Когда люди хранят данные реляционных баз данных в базы данных NoSQL, становится необходимым "соединение". Здесь библиотека, которую я, вместе со своим другом, сделал для выполнения Монгонистов в Python -

https://pypi.python.org/pypi/mongojoin/1.0.0

Код не слишком сложный и стоит попробовать!

Ответ 11

Я столкнулся со многими сообщениями, которые искали то же самое - "Мондодские соединения" и альтернативы или эквиваленты. Поэтому мой ответ помог бы многим другим, которые похожи на меня. Это ответ, который я бы искал.

Я использую схему Mongoose с Express. Существует функция, называемая Population вместо объединений.

Как упоминалось в Mongoose docs.

В MongoDB нет объединений, но иногда нам нужны ссылки на документы в других коллекциях. Это то место, где население приходит.

Этот fooobar.com/info/40329/... показывает простой пример того, как его использовать.