您需要像这样设计您的用户和推文模式:
用户:
const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
username: String,
follows: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
]
});
module.exports = mongoose.model("User", userSchema);
推文:
const mongoose = require("mongoose");
const tweetSchema = new mongoose.Schema({
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
},
tweetText: String
});
module.exports = mongoose.model("Tweet", tweetSchema);
然后你可以使用下面的代码,插入用户、推文、获取用户及其关注者,以及用户关注者的推文:
索引.js
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const url = "mongodb://localhost:27017/tweet"; //change url to your db
const User = require("./models/user");
const Tweet = require("./models/tweet");
const port = 3000;
app.use(express.json());
mongoose
.connect(url, {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
app.listen(port, () => {
console.log(`App running on port ${port}...`);
});
})
.catch(error => console.log(error));
app.post("/user", async (req, res) => {
let result = await User.create(req.body);
res.send(result);
});
app.get("/user/:userId", async (req, res) => {
const result = await User.findById(req.params.userId).populate({
path: "follows",
select: "_id username"
});
res.send(result);
});
app.post("/user/:userId/follow/:followedUserId", async (req, res) => {
const result = await User.findByIdAndUpdate(
req.params.userId,
{
$push: {
follows: req.params.followedUserId
}
},
{ new: true }
);
res.send(result);
});
app.post("/tweet", async (req, res) => {
let result = await Tweet.create(req.body);
res.send(result);
});
app.get("/user/:userId/followedTweets", async (req, res) => {
const user = await User.findById(req.params.userId);
const result = await Tweet.find({ userId: { $in: user.follows } });
res.send(result);
});
首先创建几个用户发送一个POST到这个urlhttp://localhost:3000/user:
请求:
{
"username": "username1"
}
然后使用此 url 将关注者添加到给定用户:
http://localhost:3000/user/5ddfdfaf8c62b141146cbcff/follow/5ddfdfd18c62b141146cbd02
这意味着 ID 为 5ddfdfaf8c62b141146cbcff 的用户关注用户 5ddfdfd18c62b141146cbd02。
此时您可以让用户及其关注的用户向该网址发送GET 请求:
http://localhost:3000/user/5ddfdfaf8c62b141146cbcff
响应会是这样的:
{
"follows": [
{
"_id": "5ddfdfbf8c62b141146cbd00",
"username": "username2"
},
{
"_id": "5ddfdfc78c62b141146cbd01",
"username": "username3"
},
{
"_id": "5ddfdfd18c62b141146cbd02",
"username": "username4"
}
],
"_id": "5ddfdfaf8c62b141146cbcff",
"username": "username1",
"__v": 0
}
从这个响应中,我们了解到 username1 跟在 username2、username3 和 username4 之后。
然后您可以创建将POST 发送到此网址的推文:http://localhost:3000/tweet
请求:
{
"userId": "5ddfdfbf8c62b141146cbd00",
"tweetText": "user 2 tweet 1"
}
回复:
{
"_id": "5ddfe1e7911cec475093f623",
"userId": "5ddfdfbf8c62b141146cbd00",
"tweetText": "user 2 tweet 1",
"__v": 0
}
添加几条这样的推文后,您可以发送GET 请求此网址以获取用户关注的用户推文:
http://localhost:3000/user/5ddfdfaf8c62b141146cbcff/followedTweets
响应会是这样的:
[
{
"_id": "5ddfe1e7911cec475093f623",
"userId": "5ddfdfbf8c62b141146cbd00",
"tweetText": "user 2 tweet 1",
"__v": 0
},
{
"_id": "5ddfe20a911cec475093f624",
"userId": "5ddfdfbf8c62b141146cbd00",
"tweetText": "user 2 tweet 2",
"__v": 0
},
{
"_id": "5ddfe22b911cec475093f625",
"userId": "5ddfdfc78c62b141146cbd01",
"tweetText": "user 3 tweet 1",
"__v": 0
}
]