programing tip

MongoDB 및 "결합"

itbloger 2020. 6. 1. 19:11
반응형

MongoDB 및 "결합"


이 질문에는 이미 답변이 있습니다.

MongoDB는 공식적으로 "join"을 지원하지 않습니다. 이것은 무엇을 의미 하는가?이것은 "우리는 두 개의 컬렉션 (테이블)을 함께 연결할 수 없습니다"라는 의미입니까?

_id

컬렉션 A 의 값을

other_id

컬렉션 B 의 값에 넣으면 두 컬렉션을 간단히 연결할 수 있습니까?내 이해가 정확하면 MongoDB는 쿼리를 실행할 때 두 테이블을 함께 연결할 수 있습니다. 이것은

http://www.mongodb.org/display/DOCS/Schema+Design에

쓰여진 "참조"에 의해 수행됩니다 .그렇다면 "조인"이란 무엇을 의미합니까?MongoDB 스키마 디자인을 배우는 데 필수적이므로 답변을 알고 싶습니다.

http://www.mongodb.org/display/DOCS/Schema+Design


관계는 필요할 때만 평가되므로 참여하지 않습니다. 반면에 (SQL 데이터베이스에서) 조인은 관계를 해결하여 마치 단일 테이블 인 것처럼 리턴합니다 ( "두 테이블을 하나로 결합").DBRef에 대한 자세한 내용은

http://docs.mongodb.org/manual/applications/database-references/를 참조하십시오.

참조 해결을위한 두 가지 가능한 솔루션이 있습니다. 하나는 거의 설명한대로 수동으로 수행하는 것입니다. 다른 문서의 other_id에 문서의 _id를 저장 한 다음 관계를 해결하기위한 고유 한 함수를 작성하십시오. 다른 해결책은 위의 매뉴얼 페이지에 설명 된대로 DBRefs를 사용하여 MongoDB 가 요청시

클라이언트 측

관계를 해결하도록하는 것 입니다. 두 가지 방법 모두 클라이언트 측 관계를 해결하므로 어떤 솔루션을 선택하든 문제가되지 않습니다 (SQL 데이터베이스는 서버 측에서 조인을 해결한다는 점에 유의하십시오).


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>
     }
}

데이터베이스는 문서 간 조인 또는 자동 "링크"를 수행하지 않습니다. 그러나 클라이언트 측에서 직접 할 수 있습니다. 2를 수행해야하는 경우에는 문제가 없지만 2000을 수행해야하는 경우 클라이언트 / 서버 처리 횟수로 인해 작업이 느려질 수 있습니다.MongoDB에는 일반적인 패턴이 포함되어 있습니다. 정규화 할 때 관계 적으로 부분으로 나뉩니다. 몽고에서는 종종 이러한 문서가 단일 문서가되므로 조인이 필요하지 않습니다. 그러나 필요할 때 클라이언트 쪽에서해야합니다.고전적인 ORDER, ORDER-LINEITEM 예제를 고려하십시오. 하나의 광고 주문과 8 개의 광고 항목은 9 행이며 관계형입니다. MongoDB에서는 일반적으로 임베디드 광고 항목이 포함 된 주문 인 단일 BSON 문서로 모델링합니다. 따라서이 경우 조인 문제가 발생하지 않습니다. 그러나 주문에는 별도의 콜렉션 인 CUSTOMER가 있습니다. 클라이언트는 주문 문서에서 cust_id를 읽은 다음 필요에 따라 별도로 가져올 수 있습니다.mongodb.org 웹 사이트에 스키마 디자인 대화에 대한 비디오와 슬라이드가 있습니다.


mongoDB에서 쿼리에 참여하는 한 종류의 ID는 일치하는 id에 대해 하나의 컬렉션을 요청하고 id를 list (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} } )

첫 번째 링크 예는 MongoDB 참조가 조인이 아닌 게으른로드와 매우 유사하게 동작하는 방법을 보여줍니다. 두 컬렉션 모두에서 발생하는 쿼리가 없으므로 하나를 쿼리 한 다음 참조로 다른 컬렉션에서 항목을 조회합니다.


mongoDB가 관계가 없다는 사실로 인해

일부 사람들은 그것을 쓸모없는 것으로 간주했습니다

. DB를 디자인하기 전에 무엇을하고 있는지 알아야한다고 생각합니다. MongoDB와 같은 noSQL DB를 사용하기로 선택한 경우 스키마를 구현하는 것이 좋습니다. 이렇게하면 컬렉션이 SQL 데이터베이스의 테이블과 비슷하거나 비슷해집니다. 또한 효율성상의 이유로 필요하지 않은 경우 비정규 화 (임베딩)를 피하십시오.자신의 noSQL 데이터베이스를 설계하려면

Firebase

설명서를 살펴 보는 것이 좋습니다 . 이들이 서비스를 위해 데이터를 구성하는 방법을 이해하면 유사한 패턴을 쉽게 디자인 할 수 있습니다.다른 사람들이 지적했듯이

Meteor

(Javascript 프레임 워크)를 제외하고 클라이언트 측에서 조인을 수행해야합니다.이

패키지로

서버 측에서 조인을 수행 할 수 있습니다 (다른 프레임 워크는 알 수 없습니다. 그래서). 그러나이 선택에 따라 결정하기 전에이

기사

를 읽는 것이 좋습니다 .

Edit 28.04.17: Recently Firebase published this excellent series on designing noSql Databases. They also highlighted in one of the episodes the reasons to avoid joins and how to get around such scenarios by denormalizing your database.


Consider using mongoose? It gives you the ability to do joins on mongo data.


If you use mongoose, you can just use(assuming you're using subdocuments and population):

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

It retrieves Statuses which belong to one of Profile (profileId) friends. Friends is array of references to other Profiles. Profile schema with friends defined:

schema = new mongoose.Schema
  # ...

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

you can use MongoDB addons , it's greate , and allow to join , merge and create a query builer try it : https://github.com/petersirka/mongodb-addons


Being a user of MongoDB myself, I had to fetch data from related collections rather frequently. When people store data of relational databases into NoSQL databases, "joining" does become necessary. Here's a library that I, along with my friend, have made to perform Mongo Joins in Python -

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

The code isn't too complicated and well worth a try !


I came across lot of posts searching for the same - "Mongodb Joins" and alternatives or equivalents. So my answer would help many other who are like me. This is the answer I would be looking for.

I am using Mongoose with Express framework. There is a functionality called Population in place of joins.

As mentioned in Mongoose docs.

There are no joins in MongoDB but sometimes we still want references to documents in other collections. This is where population comes in.

This StackOverflow answer shows a simple example on how to use it.

참고URL : https://stackoverflow.com/questions/4067197/mongodb-and-joins

반응형