问题描述
我是否将代码放在server.js中具有现有字段的文档中。还是我可以在前端(reactjs)中这样做,因为我有一个计数器字段,如果要添加它,但该字段已经存在,我想增加一个计数器字段。
这是我的server.js
const express = require("express");
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
const uri = process.env.ATLAS_URI;
mongoose.connect(uri,{
useNewUrlParser: true,useCreateIndex: true,useUnifiedTopology: true
})
.then(() => console.log('DB Connected!\n'))
.catch(err => {
console.log(err);
});
mongoose.connection.once('open',() =>{
console.log('MongoDB database connection established successfully');
})
const trackRouter = require('./routes/track');
app.use('/track',trackRouter);
app.listen(port,() =>{
console.log('Server is running on port: 5000');
})
这是我的track.model.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const trackSchema = new Schema({
track:{type:String,required: true},trackID:{type:String,required:true,unique:true},year:{type:Number,required:true},genre:{type:String,album:{type:String,artist:{type:String,artistID:{type:String,count:{type:Number,},{
timestamps: true,});
const Track = mongoose.model('Track',trackSchema);
module.exports = Track;
最后这是track.js
const router = require('express').Router();
let Track = require('../models/track.model');
router.route('/').get((req,res) => {
Track.find()
.then(track => res.json(track))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/add').post((req,res) => {
const track = req.body.track;
const trackID = req.body.trackID;
const year = Number(req.body.year);
const genre = req.body.genre;
const artist = req.body.artist;
const artistID = req.body.artistID;
const album = req.body.album;
const count = Number(req.body.count);
const newTrack = new Track({
track,trackID,year,genre,album,artist,artistID,count,});
newTrack.save()
.then(() => res.json('Song added!'))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/:id').get((req,res) => {
Track.findById(req.params.id)
.then(exercise => res.json(exercise))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/:id').delete((req,res) => {
Track.findByIdAndDelete(req.params.id)
.then(() => res.json('Song deleted'))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/update/:id').post((req,res) => {
Track.findById(req.params.id)
.then(track=>{
track.track = req.body.track;
track.trackID = req.body.trackID;
track.year = Number(req.body.year);
track.genre = req.body.genre;
track.album = req.body.album;
track.artist = req.body.artist;
track.artistID = req.body.artistID;
track.count = req.body.count;
track.save()
.then(() => res.json('Song updated!'))
.catch(err => res.status(400).json('Error: ' + err));
})
.catch(err => res.status(400).json('Error: '+ err));
})
module.exports = router;
在数据库内部插入文档的前端(reactJS)
const playlist1 = {
track: tracks[currentTrack].name,trackID:tracks[currentTrack].id,year:parseInt(this.state.year),genre:this.state.genre,album: tracks[currentTrack].album.name,artist: tracks[currentTrack].artists[0].name,artistID: tracks[currentTrack].artists[0].id,count: 1,}
axios.post('http://localhost:5000/track/add',playlist1)
.then(res => console.log(res.data));
解决方法
在Mongo Shell中,您可以write a query查看给定字段是否存在。
db.collection.find({field: {$exists: true}})
无法看到您的代码或上下文,我不能肯定如何编写查询查询。
通常,您会将查询放在服务器中,并向您的UI公开API路由,以便它可以按您喜欢的任何格式访问查询返回的信息。
更新
收到更新的评论后,我发现您不想查看字段是否存在,而是想知道字段中是否存在特定值。
这可以通过更新查询来完成,您可以在查询中指定trackID
并在更新对象中增加计数器。
const trackID = 1
await Track.findOneAndUpdate(
{ trackID },// The query to find the docs to update
{ $inc: { count: 1 } },// The actual update to perform
{ upsert: true },// Mongoose options. This one will create the document if it doesn't exist
)
https://mongoosejs.com/docs/api/model.html#model_Model.findOneAndUpdate