복붙노트

[MONGODB] MongoDB의 쿼리 여러 컬렉션을 한 번에

MONGODB

MongoDB의 쿼리 여러 컬렉션을 한 번에

users
{
 "_id":"12345",
 "admin":1
},
{
 "_id":"123456789",
 "admin":0
}

posts
{
 "content":"Some content",
 "owner_id":"12345",
 "via":"facebook"
},
{
 "content":"Some other content",
 "owner_id":"123456789",
 "via":"facebook"
}

여기 내 MongoDB를에서 샘플입니다. 나는 "페이스 북"에 동일 및 관리자 (: 1 "관리자")에 의해 게시 속성 "을 통해"이 모든 게시물 싶어. 나는이 쿼리를 획득하는 방법을 알아낼 수 없었다. MongoDB를 관계형 데이터베이스가 아니기 때문에, 나는이 작업을 가입 할 수 없었다. 어떤 해결책이 될 수 있을까?

해결법

  1. ==============================

    1.MongoDB를 가입하려고하면 MongoDB의 사용 목적을 물리 칠 것이다. 당신은, 그러나, DBref를 사용하고 자동으로 이러한 참조를 가져옵니다 있도록 응용 프로그램 수준 코드 (또는 라이브러리)를 작성할 수 있습니다.

    MongoDB를 가입하려고하면 MongoDB의 사용 목적을 물리 칠 것이다. 당신은, 그러나, DBref를 사용하고 자동으로 이러한 참조를 가져옵니다 있도록 응용 프로그램 수준 코드 (또는 라이브러리)를 작성할 수 있습니다.

    또는 당신은 당신의 스키마를 변경하고 포함 된 문서를 사용할 수 있습니다.

    귀하의 최종 선택은 휴가 일에 그들이 지금과 두 개의 질의를 할 정확히 방법입니다.

  2. ==============================

    2.여기에 귀하의 질문에 대한 답변입니다.

    여기에 귀하의 질문에 대한 답변입니다.

    db.getCollection('users').aggregate([
        {$match : {admin : 1}},
        {$lookup: {from: "posts",localField: "_id",foreignField: "owner_id",as: "posts"}},
        {$project : {
                posts : { $filter : {input : "$posts"  , as : "post", cond : { $eq : ['$$post.via' , 'facebook'] } } },
                admin : 1
    
            }}
    
    ])
    

    또는 중 하나는 MongoDB의 그룹 옵션으로 갈 수 있습니다.

    db.getCollection('users').aggregate([
        {$match : {admin : 1}},
        {$lookup: {from: "posts",localField: "_id",foreignField: "owner_id",as: "posts"}},
        {$unwind : "$posts"},
        {$match : {"posts.via":"facebook"}},
        { $group : {
                _id : "$_id",
                posts : {$push : "$posts"}
        }}
    ])
    
  3. ==============================

    3.여러 컬렉션에서 레코드를 얻을 $ 조회 (복수)를 사용할 수 있습니다 :

    여러 컬렉션에서 레코드를 얻을 $ 조회 (복수)를 사용할 수 있습니다 :

    예:

    더 많은 컬렉션이있는 경우 (I 데모 여기에 3 명 컬렉션을 가지고, 당신은 3 개 이상을 가질 수 있습니다). 나는 하나의 객체에서 3 개 컬렉션에서 데이터를 얻으려면 :

    컬렉션과 같습니다 :

    db.doc1.find () 꽤 ().;

    {
        "_id" : ObjectId("5901a4c63541b7d5d3293766"),
        "firstName" : "shubham",
        "lastName" : "verma"
    }
    

    db.doc2.find () 꽤 ().;

    {
        "_id" : ObjectId("5901a5f83541b7d5d3293768"),
        "userId" : ObjectId("5901a4c63541b7d5d3293766"),
        "address" : "Gurgaon",
        "mob" : "9876543211"
    }
    

    db.doc3.find () 꽤 ().;

    {
        "_id" : ObjectId("5901b0f6d318b072ceea44fb"),
        "userId" : ObjectId("5901a4c63541b7d5d3293766"),
        "fbURLs" : "http://www.facebook.com",
        "twitterURLs" : "http://www.twitter.com"
    }
    

    이제 쿼리는 다음과 같이 될 것입니다 :

    db.doc1.aggregate([
        { $match: { _id: ObjectId("5901a4c63541b7d5d3293766") } },
        {
            $lookup:
            {
                from: "doc2",
                localField: "_id",
                foreignField: "userId",
                as: "address"
            }
        },
        {
            $unwind: "$address"
        },
        {
            $project: {
                __v: 0,
                "address.__v": 0,
                "address._id": 0,
                "address.userId": 0,
                "address.mob": 0
            }
        },
        {
            $lookup:
            {
                from: "doc3",
                localField: "_id",
                foreignField: "userId",
                as: "social"
            }
        },
        {
            $unwind: "$social"
        },
    
      {   
        $project: {      
               __v: 0,      
               "social.__v": 0,      
               "social._id": 0,      
               "social.userId": 0
           }
     }
    
    ]).pretty();
    

    그런 다음 그 결과는 다음과 같습니다

    {
        "_id" : ObjectId("5901a4c63541b7d5d3293766"),
        "firstName" : "shubham",
        "lastName" : "verma",
    
        "address" : {
            "address" : "Gurgaon"
        },
        "social" : {
            "fbURLs" : "http://www.facebook.com",
            "twitterURLs" : "http://www.twitter.com"
        }
    }
    

    각 컬렉션에서 모든 레코드를 원하는 경우에 당신은 쿼리에서 선 아래 제거해야합니다 :

    {
                $project: {
                    __v: 0,
                    "address.__v": 0,
                    "address._id": 0,
                    "address.userId": 0,
                    "address.mob": 0
                }
            }
    
    {   
            $project: {      
                   "social.__v": 0,      
                   "social._id": 0,      
                   "social.userId": 0
               }
         }
    

    위의 코드를 제거 후에는 전체 기록으로 얻을 것이다 :

    {
        "_id" : ObjectId("5901a4c63541b7d5d3293766"),
        "firstName" : "shubham",
        "lastName" : "verma",
        "address" : {
            "_id" : ObjectId("5901a5f83541b7d5d3293768"),
            "userId" : ObjectId("5901a4c63541b7d5d3293766"),
            "address" : "Gurgaon",
            "mob" : "9876543211"
        },
        "social" : {
            "_id" : ObjectId("5901b0f6d318b072ceea44fb"),
            "userId" : ObjectId("5901a4c63541b7d5d3293766"),
            "fbURLs" : "http://www.facebook.com",
            "twitterURLs" : "http://www.twitter.com"
        }
    }
    
  4. ==============================

    4.MongoDB의에서 이전에 언급 한 바와 같이 당신은 콜렉션 간격이 가입 할 수 있습니다.

    MongoDB의에서 이전에 언급 한 바와 같이 당신은 콜렉션 간격이 가입 할 수 있습니다.

    귀하의 예를 들어 해결책이 될 수있다 :

    var myCursor = db.users.find({admin:1});
    var user_id = myCursor.hasNext() ? myCursor.next() : null;
    db.posts.find({owner_id : user_id._id});
    

    http://es.docs.mongodb.org/manual/core/cursors/ : 커서 섹션 - 참조 설명서를 참조하십시오

    다른 솔루션은 게시물 컬렉션에서 포함 사용자에게 겠지만, 대부분의 웹 응용 프로그램을 사용자 수집 할 필요가 보안상의 이유로 독립을 위해 나는 생각한다. 사용자 컬렉션 역할, permissons 등이있을 수 있습니다

    posts
    {
     "content":"Some content",
     "user":{"_id":"12345", "admin":1},
     "via":"facebook"
    },
    {
     "content":"Some other content",
     "user":{"_id":"123456789", "admin":0},
     "via":"facebook"
    }
    

    그리고:

    db.posts.find({user.admin: 1 });
    
  5. ==============================

    5.여러 쿼리를 수행 또는 "데이터베이스 참조"에 포함 된 문서 나 모양을 사용합니다.

    여러 쿼리를 수행 또는 "데이터베이스 참조"에 포함 된 문서 나 모양을 사용합니다.

  6. ==============================

    6.하나의 솔루션 : 추가 isAdmin : 게시물 수집 문서에 0/1 플래그.

    하나의 솔루션 : 추가 isAdmin : 게시물 수집 문서에 0/1 플래그.

    기타 솔루션 : 사용 DBREFS

  7. ==============================

    7.당신은 다음과 같이 샘플 자바 스크립트를 작성하고 필요할 때 함수를 호출 할 수 있습니다.

    당신은 다음과 같이 샘플 자바 스크립트를 작성하고 필요할 때 함수를 호출 할 수 있습니다.

    http://dbversity.com/mongodb-querying-multiple-collections-with-a-javascript/ :에있는 그림을 참조 마

    function colListQuery() {
    var tcol = new Array()
    tcol= db.getCollectionNames();
    for(var i = 1; i < tcol.length ; i++) {
    query = “db.” + tcol[i] + “.find()”;
    
    var docs= eval(query);
    docs.forEach( function(doc, index){ print( “Database_Name:”, db, “Collection_Name:”, tcol[i], “x_value:”, doc.x, “_id:”, doc._id) });
    
    }
    }
    

    그림과 같이 당신이 그것을 필요로 할 때 다음 colListQuery ()를 호출.

  8. from https://stackoverflow.com/questions/6502541/mongodb-query-multiple-collections-at-once by cc-by-sa and MIT license