mongodb에서 쿼리에 참여하는 방법은 무엇입니까?
다음과 같은 사용자 문서 모음이 있습니다.
User {
id:"001"
name:"John",
age:30,
friends:["userId1","userId2","userId3"....]
}
사용자에게 많은 친구가 있습니다. SQL에 다음과 같은 질문이 있습니다.
select * from user where in (select friends from user where id=?) order by age
저는 몽고DB에서 비슷한 것을 먹고 싶습니다.
집계 프레임워크의 $lookup 기능을 사용하여 쿼리 하나로 모든 것을 가져오려면 다음을 시도하십시오.
db.User.aggregate(
[
// First step is to extract the "friends" field to work with the values
{
$unwind: "$friends"
},
// Lookup all the linked friends from the User collection
{
$lookup:
{
from: "User",
localField: "friends",
foreignField: "_id",
as: "friendsData"
}
},
// Sort the results by age
{
$sort: { 'friendsData.age': 1 }
},
// Get the results into a single array
{
$unwind: "$friendsData"
},
// Group the friends by user id
{
$group:
{
_id: "$_id",
friends: { $push: "$friends" },
friendsData: { $push: "$friendsData" }
}
}
]
)
사용자 컬렉션의 내용은 다음과 같습니다.
{
"_id" : ObjectId("573b09e6322304d5e7c6256e"),
"name" : "John",
"age" : 30,
"friends" : [
"userId1",
"userId2",
"userId3"
]
}
{ "_id" : "userId1", "name" : "Derek", "age" : 34 }
{ "_id" : "userId2", "name" : "Homer", "age" : 44 }
{ "_id" : "userId3", "name" : "Bobby", "age" : 12 }
쿼리 결과는 다음과 같습니다.
{
"_id" : ObjectId("573b09e6322304d5e7c6256e"),
"friends" : [
"userId3",
"userId1",
"userId2"
],
"friendsData" : [
{
"_id" : "userId3",
"name" : "Bobby",
"age" : 12
},
{
"_id" : "userId1",
"name" : "Derek",
"age" : 34
},
{
"_id" : "userId2",
"name" : "Homer",
"age" : 44
}
]
}
편집: 이 답변은 v3.2 이전 버전의 MongoDb에만 적용됩니다.
한 번의 쿼리로는 원하는 작업을 수행할 수 없습니다.먼저 친구 사용자 ID 목록을 검색한 다음 두 번째 쿼리로 ID를 전달하여 문서를 검색하고 연령별로 정렬해야 합니다.
var user = db.user.findOne({"id" : "001"}, {"friends": 1})
db.user.find( {"id" : {$in : user.friends }}).sort("age" : 1);
https://docs.mongodb.org/manual/reference/operator/aggregation/lookup/
이것은 mongodb의 join query를 위한 문서이며, 버전 3.2의 새로운 기능입니다.
그래서 이것이 도움이 될 것입니다.
문구스 JS에서 사용할 수 있습니다..populate()
그리고.{ populate : { path : 'field' } }
예:
모델:
mongoose.model('users', new Schema({
name:String,
status: true,
friends: [{type: Schema.Types.ObjectId, ref:'users'}],
posts: [{type: Schema.Types.ObjectId, ref:'posts'}],
}));
mongoose.model('posts', new Schema({
description: String,
comments: [{type: Schema.Types.ObjectId, ref:'comments'}],
}));
mongoose.model('comments', new Schema({
comment:String,
status: true
}));
만약 당신이 친구들의 게시물을 보고 싶다면, 당신은 이것을 사용할 수 있습니다.
Users.find(). //Collection 1
populate({path:'friends', //Collection 2
populate:{path:'posts' //Collection 3
}})
.exec();
친구의 게시물을 보고 모든 댓글을 가져오려면 이것을 사용할 수도 있고, 이것을 찾을 수 없고 쿼리가 틀리면 컬렉션을 식별할 수도 있습니다.
Users.find(). //Collection 1
populate({path:'friends', //Collection 2
populate:{path:'posts', //Collection 3
populate:{path:'commets, model:Collection'//Collection 4 and more
}}})
.exec();
마지막으로 일부 컬렉션의 일부 필드만 가져오려면 속성을 사용하여 예를 선택합니다.
Users.find().
populate({path:'friends', select:'name status friends'
populate:{path:'comments'
}})
.exec();
MongoDB에는 조인이 없지만 귀하의 경우 다음을 수행할 수 있습니다.
db.coll.find({friends: userId}).sort({age: -1})
mongoDB에서 쿼리에 가입하는 한 종류는 일치하는 ID를 한 컬렉션에서 요청하고, ID를 목록(idlist)에 넣고, $in : idlist로 다른(또는 동일한) 컬렉션에서 사용합니다.
u = db.friends.find({"friends": ? }).toArray()
idlist= []
u.forEach(function(myDoc) { idlist.push(myDoc.id ); } )
db.friends.find({"id": {$in : idlist} } )
어레이 친구만 채웁니다.
User.findOne({ _id: "userId"})
.populate('friends')
.exec((err, user) => {
//do something
});
결과는 다음과 같습니다.
{
"_id" : "userId",
"name" : "John",
"age" : 30,
"friends" : [
{ "_id" : "userId1", "name" : "Derek", "age" : 34 }
{ "_id" : "userId2", "name" : "Homer", "age" : 44 }
{ "_id" : "userId3", "name" : "Bobby", "age" : 12 }
]
}
이와 동일:Mongoose - ObjectId 배열에 채우기 사용
playOrm을 사용하여 하나의 Query(S-SQL Scalable SQL)에서 원하는 작업을 수행할 수 있습니다.
var p = db.sample1.find().limit(2) ,
h = [];
for (var i = 0; i < p.length(); i++)
{
h.push(p[i]['name']);
}
db.sample2.find( { 'doc_name': { $in : h } } );
저한테는 효과가 있어요.
이용하시면 한 번에 하실 수 있습니다.다음은 다음과 같습니다.
const joinQuery = require("mongo-join-query");
joinQuery(
mongoose.models.User,
{
find: {},
populate: ["friends"],
sort: { age: 1 },
},
(err, res) => (err ? console.log("Error:", err) : console.log("Success:", res.results))
);
그 결과 사용자는 연령별로 정렬되고 모든 친구 개체가 포함됩니다.
어떻게 작동합니까?
막후에서mongo-join-query
Mongoose 스키마를 사용하여 조인할 모델을 결정하고 조인 및 쿼리를 수행할 집계 파이프라인을 만듭니다.
언급URL : https://stackoverflow.com/questions/4563205/how-to-join-query-in-mongodb
'programing' 카테고리의 다른 글
git 버전 제어를 사용하여 파일의 권한만 업데이트 및 커밋 (0) | 2023.05.31 |
---|---|
텍스트 정보.ToTitleCase가 모든 CAPS 문자열에 대해 예상대로 작동하지 않습니다. (0) | 2023.05.31 |
TSQL: 현지 시간을 UTC로 변환하는 방법은 무엇입니까? (SQL Server 2008) (0) | 2023.05.26 |
git 저장소에서 하나의 파일만 드문드문 체크아웃하는 방법은 무엇입니까? (0) | 2023.05.26 |
zure의 원격 kubernetes 클러스터에 액세스하도록 kubectl 명령 구성 (0) | 2023.05.26 |