简体   繁体   English

如何查询以基于一个字段作为用户名获取引用到另一个集合的所有文档

[英]How to query to get all documents referenced to another collection based on one field as username

In my Node API and MongoDB, I'm trying to make an endpoint to get all the posts associated with one username of a profile.在我的 Node API 和 MongoDB 中,我试图创建一个端点来获取与配置文件的一个用户名相关联的所有帖子。 In my Profile schema, I have a reference to the Post Schema and in my Post schema, I have a reference to the Username from Profile schema.在我的 Profile 架构中,我引用了 Post Schema,在我的 Post 架构中,我引用了 Profile 架构中的 Username。 My issue I don't know how to get all the posts for that username.我的问题我不知道如何获取该用户名的所有帖子。 I did similarly but with embedded for the Experience schema but I'm not sure how to do that for the referenced collections.我做了类似的事情,但嵌入了 Experience 模式,但我不确定如何为引用的集合执行此操作。

Post model:岗位型号:

const { Connect } = require("../db");

const reactionSchema = {
    likedBy: {
        type: String,
        unique: true,
        sparse: true
    }
};

const postSchema = {
    text: {
        type: String,
        required: true,
        unique: true,
        sparse: false
    },    
    username: {
        type: Connect.Schema.Types.String,
        ref: "Profile"
    },    
    image: {
        type: String,
        default: "https://via.placeholder.com/150",
        required: false
    },
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },    
    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    },    
    reactions: [reactionSchema],    
    comments: {
        type: Connect.Schema.Types.ObjectId,
        ref: "Comment",
        required: false
    }
};

const collectionName = "post";
const postSchemaModel = Connect.Schema(postSchema);
const Post = Connect.model(collectionName, postSchemaModel);

module.exports = Post;

Profile model:型材型号:

// Here defining profile model
// Embedded we have the Experience as []
const { Connect } = require("../db");
const { isEmail } = require("validator");

const postSchema = {
    type: Connect.Schema.Types.ObjectId,
    ref: "Post"
};

const experienceSchema = {
    role: {
        type: String,
        required: true
    },
    company: {
        type: String,
        required: true
    },
    startDate: {
        type: Date,
        required: true
    },
    endDate: {
        type: Date,
        required: false
    },
    description: {
        type: String,
        required: false
    },    
    area: {
        type: String,
        required: true
    },
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },    
    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    },    
    username: {
        type: String,
        required: false
    },
    image: {
        type: String,
        required: false,
        default: "https://via.placeholder.com/150"
    }
};

const profileSchema = {
    firstname: {
        type: String,
        required: true
    },   
    surname: {
        type: String,
        required: true
    },    
    email: {
        type: String,
        trim: true,
        lowercase: true,
        unique: true,
        required: [true, "Email is required"],
        validate: {
            validator: string => isEmail(string),
            message: "Provided email is invalid"
        }
    },    
    bio: {
        type: String,
        required: true
    },    
    title: {
        type: String,
        required: true
    },    
    area: {
        type: String,
        required: true
    },    
    imageUrl: {
        type: String,
        required: false,
        default: "https://via.placeholder.com/150"
    },    
    username: {
        type: String,
        required: true,
        unique: true
    },    
    experience: [experienceSchema],
    posts: [postSchema],    
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },    
    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    }
};

const collectionName = "profile";
const profileSchemaModel = Connect.Schema(profileSchema);
const Profile = Connect.model(collectionName, profileSchemaModel);

module.exports = Profile;

I was able to make this for the embedded experience but not sure that correct for referenced collection:我能够为嵌入式体验做到这一点,但不确定参考集合是否正确:

const profileWithExperiences = await Student.aggregate([
  { $match: { username: res.username.username } },
  {
    $unwind: "$experience"
  },
  {
    $match: {
      "experience._id": new ObjectID(req.params.experienceId)
    }
  },
  {
    $project: {
      username: 1,
      experience: 1,
      _id: 0
    }
  }
]);

I would like to see an example for referenced collections as it is confusing me how should I do that我想看一个引用集合的例子,因为它让我困惑我应该怎么做

[EDIT] JSON for Profiles and Posts [编辑] 个人资料和帖子的 JSON

{
    "_id": ObjectId("5e2c98fc3d785252ce5b5693"),
    "imageUrl": "https://i.pravatar.cc/300",
    "firstname": "Jakos",
    "surname": "Lemi",
    "email": "lemi@email.com",
    "bio": "My bio bio",
    "title": "Senior IT developer",
    "area": "Copenhagen",
    "username": "Jakos",
    "experience": [
        {
            "image": "https://via.placeholder.com/150",
            "_id": ObjectId("5e3975f95fbeec9095ff3d2f"),
            "role": "Developer",
            "company": "Google",
            "startDate": ISODate("2018-11-09T23:00:00.000Z"),
            "endDate": ISODate("2019-01-05T23:00:00.000Z"),
            "area": "Copenhagen",
            "createdAt": ISODate("2020-02-04T13:47:37.167Z"),
            "updatedAt": ISODate("2020-02-04T13:47:37.167Z")
        },
        {
            "image": "https://via.placeholder.com/150",
            "_id": ObjectId("5e3978bf5e399698e20c56d4"),
            "role": "Developer",
            "company": "IBM",
            "startDate": ISODate("2018-11-09T23:00:00.000Z"),
            "endDate": ISODate("2019-01-05T23:00:00.000Z"),
            "area": "Copenhagen",
            "createdAt": ISODate("2020-02-04T13:59:27.412Z"),
            "updatedAt": ISODate("2020-02-04T13:59:27.412Z")
        }
    ],
    "createdAt": ISODate("2020-01-25T19:37:32.727Z"),
    "updatedAt": ISODate("2020-02-04T23:14:37.122Z"),
    "__v": NumberInt("0")
}

Post邮政

{
    "_id": ObjectId("5e3beb639e072afedd19dcef"),
    "username": ObjectId("5e2c98fc3d785252ce5b5693"),
    "image": "https://via.placeholder.com/150",
    "text": "My awesome post",
    "createdAt": ISODate("2020-02-06T10:33:07.22Z"),
    "updatedAt": ISODate("2020-02-06T10:33:07.22Z"),
    "reactions": [ ],
    "__v": NumberInt("0")
}

Output expected:预期输出:

{
    "username": "Jakos",
    "postsCount": [1],
    "posts": [
        {
        "_id": ObjectId("5e3beb639e072afedd19dcef"),
        "image": "https://via.placeholder.com/150",
        "text": "My awesome post",
        "createdAt": ISODate("2020-02-06T10:33:07.22Z"),
        "updatedAt": ISODate("2020-02-06T10:33:07.22Z"),
        "reactions": [ ],
        "__v": NumberInt("0")
    }
    ]

}

I want to see all the posts related to that username我想查看与该用户名相关的所有帖子

You can use the $lookup aggregation to join collections.您可以使用$lookup聚合来连接集合。

db.profiles.aggregate([
  {
    $match: {
      username: "Jakos"
    }
  },
  {
    $lookup: {
      from: "posts",   //the name of the posts collection, change this if it is different
      localField: "_id",
      foreignField: "username",
      as: "posts"
    }
  },
  {
    $project: {
      username: 1,
      posts: 1,
      postsCount: {
        $size: "$posts"
      },
      _id: 0
    }
  }
])

Playground操场

For mongoose it should be like this in your app:对于mongoose它在您的应用程序中应该是这样的:

const profileWithExperiences = await Student.aggregate([
  { $match: { username: res.username.username } },
  {
    $unwind: "$experience"
  },
  {
    $lookup: {
      from: "posts", //the name of the posts collection, change this if it is different
      localField: "_id",
      foreignField: "username",
      as: "posts"
    }
  },
  {
    $project: {
      username: 1,
      posts: 1,
      postsCount: {
        $size: "$posts"
      },
      _id: 0
    }
  }
]);

Try to get like this i am getting data from two table with the use of node and mongodb.尝试像这样我使用 node 和 mongodb 从两个表中获取数据。

var param = {};
    param['user_id']=id;
    var search={ user_id:param.user_id,status: [ 'Pending', 'Accepted' ] };
    var output={};
    output = await JobRequest.find(search); 
    if(output !=0)
    {
            var JSon=await JobRequest.aggregate([
                {$match: { user_id: {$gte:id}}  }, 
                     {
                     "$project": {
                      "employee_id": {
                        "$toObjectId": "$employee_id"
                      }, 
                      "service_id": {
                        "$toObjectId": "$service_id"
                      }, 
                      "createdDate": {
                        "$toString": "$createdDate"
                      }, 
                      "chat_status": {
                        "$toString": "$chat_status"
                      },    
                      "status": {
                        "$toString": "$status"
                      },                      
                      "delivery_address": {
                        "$toString": "$delivery_address"
                      },                 
                      "delivery_lat": {
                        "$toString": "$delivery_lat"
                      },         
                      "delivery_lang": {
                        "$toString": "$delivery_lang"
                      },
                    }
                     },

                     {
                      $lookup:
                         {
                            from: "employees",
                            localField: "employee_id",
                            foreignField: "_id",
                            as: "employee_details"
                        }
                   },
                   {
                      $lookup:
                         {
                            from: "services",
                            localField: "service_id",
                            foreignField: "_id",
                            as: "service_details"
                        }
                   }
               ]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从一个集合中获取未从另一个集合中引用的所有文档 - Get all Documents from one Collection that are not referenced from another collection 如何在一个集合中找到另一个集合中的文档未引用的 MongoDB 文档? - How to find MongoDB documents in one collection not referenced by documents in another collection? 如何从另一个模型的引用字段中查询一个模型的文档? - How to query documents of one model, from referenced field from another model? 如何使用 MongoRepositoty @Query 删除 mongodb 集合的所有文档中的字段 - How to delete a field in all documents of mongodb collection using MongoRepositoty @Query 基于另一个集合上的字段对文档进行分组 Mongodb - Group documents based on field on another collection Mongodb MongoDB - 如何找到其他集合中未被文档引用的所有文档 - MongoDB - how can I find all documents that aren't referenced by a document from another collection 如何获取另一个集合中引用的MongoDB文档的列表 - How do I get a list of MongoDB documents that are referenced inside another collection MongoDB - 如何获取未被不同集合中的任何文档引用的所有文档 - MongoDB - How to get all documents not being referenced by any document in a different collection 如何用另一个集合的计数查询结果填充一个集合的字段? - how to populate field of one collection with count query results of another collection? 如何查询MongoDB中的集合值和引用文档值? - How to query on collection values ​and referenced documents values ​in MongoDB?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM