[MONGODB] MongoDB의 쿼리 여러 컬렉션을 한 번에
MONGODBMongoDB의 쿼리 여러 컬렉션을 한 번에
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.MongoDB를 가입하려고하면 MongoDB의 사용 목적을 물리 칠 것이다. 당신은, 그러나, DBref를 사용하고 자동으로 이러한 참조를 가져옵니다 있도록 응용 프로그램 수준 코드 (또는 라이브러리)를 작성할 수 있습니다.
MongoDB를 가입하려고하면 MongoDB의 사용 목적을 물리 칠 것이다. 당신은, 그러나, DBref를 사용하고 자동으로 이러한 참조를 가져옵니다 있도록 응용 프로그램 수준 코드 (또는 라이브러리)를 작성할 수 있습니다.
또는 당신은 당신의 스키마를 변경하고 포함 된 문서를 사용할 수 있습니다.
귀하의 최종 선택은 휴가 일에 그들이 지금과 두 개의 질의를 할 정확히 방법입니다.
-
==============================
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.여러 컬렉션에서 레코드를 얻을 $ 조회 (복수)를 사용할 수 있습니다 :
여러 컬렉션에서 레코드를 얻을 $ 조회 (복수)를 사용할 수 있습니다 :
예:
더 많은 컬렉션이있는 경우 (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.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.여러 쿼리를 수행 또는 "데이터베이스 참조"에 포함 된 문서 나 모양을 사용합니다.
여러 쿼리를 수행 또는 "데이터베이스 참조"에 포함 된 문서 나 모양을 사용합니다.
-
==============================
6.하나의 솔루션 : 추가 isAdmin : 게시물 수집 문서에 0/1 플래그.
하나의 솔루션 : 추가 isAdmin : 게시물 수집 문서에 0/1 플래그.
기타 솔루션 : 사용 DBREFS
-
==============================
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 ()를 호출.
from https://stackoverflow.com/questions/6502541/mongodb-query-multiple-collections-at-once by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 통해 몽고 쉘에서 중첩 된 배열을 업데이트 [중복] (0) | 2019.12.03 |
---|---|
[MONGODB] 몽구스 고유 색인 작동하지 않습니다! (0) | 2019.12.03 |
[MONGODB] 몽구스에서 어떻게 날짜별로 정렬합니까? (Node.js를) (0) | 2019.12.03 |
[MONGODB] 어떻게 Windows 서비스로 MongoDB의를 실행할 수 있습니까? (0) | 2019.12.03 |
[MONGODB] 위치`$ '연산자의 다중 사용은 중첩 된 배열을 업데이트 (0) | 2019.12.03 |