Вы можете присоединиться к двум коллекциям в Монго, используя поиск, который предлагается в версии 3.2. В вашем случае запрос будет
db.comments.aggregate({
$lookup:{
from:"users",
localField:"uid",
foreignField:"uid",
as:"users_comments"
}
})
, или вы также можете присоединиться к пользователям, тогда будет небольшое изменение, как указано ниже.
db.users.aggregate({
$lookup:{
from:"comments",
localField:"uid",
foreignField:"uid",
as:"users_comments"
}
})
Он будет работать так же, как левое и правое соединение в SQL.
Вы можете переместить выборку в отдельный метод, который вы вызываете как в componentDidMount
, так и в nextPic
.
Пример
class App extends React.Component {
state = {
meme: {},
num: 6
};
componentDidMount() {
this.fetchMeme();
}
fetchMeme = () => {
const url = `http://meme.com/${this.state.num}`;
fetch(url)
.then(resp => resp.json())
.then(data => {
this.setState({
meme: data
});
});
};
nextPic = () => {
this.setState({
num: this.state.num >= this.state.meme.totalMemes ? 1 : this.state.num + 1
}, this.fetchMeme);
};
render() {
return (
<div>
<h1>{this.state.meme.title}</h1>
<img key={this.state.num} src={this.state.meme.encodedurl} />
<button onClick={this.nextPic}>Next</button>
</div>
);
}
}
Сделайте вызов API api функцией. попробуйте это:
constructor() {
super();
this.state = {
meme: {},
num: 6
};
}
componentDidMount() {
fetchFromAPI(this.state.num);
}
let fetchFromAPI = (num)=>{
this.APIURL = `http://meme.com/${num}`;
fetch(this.APIURL)
.then(resp => resp.json())
.then(data => {
console.log(data);
if (data) {
this.setState({
meme: data
});
}
console.log(this.state.meme);
});
}
nextPic = () => {
if (this.state.num > this.state.meme.totalMemes) {
this.setState({
num: 1
});
} else {
this.setState({
num: this.state.num + 1
});
console.log(this.state.num);
}
fetchFromAPI(this.state.num);
};
render() {
return (
<div>
<h1>{this.state.meme.title}</h1>
<img key={this.state.num} src={this.state.meme.encodedurl} />
<button onClick={this.nextPic}>Next</button>
</div>
);
}
Я не проверял это, но похоже, что это будет работать.