programing

mongodb에서 쿼리에 참여하는 방법은 무엇입니까?

linuxpc 2023. 5. 26. 20:48
반응형

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

반응형