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-queryMongoose 스키마를 사용하여 조인할 모델을 결정하고 조인 및 쿼리를 수행할 집계 파이프라인을 만듭니다.
언급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 |