Запрос Mongoose с $ elemMatch и обновлением - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь запросить пользователя, в котором вложенный документ содержит два поля, которые соответствуют двум значениям.

Пользователь не может:

  • Обновление станций других пользователей. Проверено apiKey
  • Обновление станции с неправильной комбинацией "stationName" и "mac"

Я немного запутался в приведенных выше правилах и структуре схемы ниже. Я продолжаю писать длинные множественные запросы, чтобы соблюдать вышеприведенные правила. Может ли кто-нибудь помочь мне утвердить мой код?

Мангуст Модель

const stationSchema = new mongoose.Schema({
    mac: String,
    stationName: String,
    syncReadings: Boolean,
    firstReadings: {type: Boolean, default: false},
    latestTemperature: Number,
    latestHumidity: Number,
    temperature: [{
        date: Date,
        reading: {type: Number, default: ""},
        humidity: Number
    }],
    humidity:[{
        date: Date,
        reading: {type: Number, default: ""},
        humidity: Number
    }],
    measures: [{
        date: Date,
        temperature: Number,
        humidity: Number
    }],
    lastUpdated: Date
});

// Define user schema
var userSchema = mongoose.Schema({
   apiKey: String,
   stations : [stationSchema]

},  
{
    usePushEach: true 
}
);

Пример запроса в почтовом запросе

app.post('/api/stations/:stationName/measures', function(req, res, next) {

var now = new Date()

const station = {
    mac: req.body.mac,
    stationName: req.params.stationName,
    measures: {
        date: now,
        temperature: req.body.temperature,
        humidity: req.body.humidity
    }
}

const query = {
    apiKey: req.user.apiKey
}

const elemMatch = {
    stations: { $elemMatch:
        {   'stationName': station.stationName,
            'mac': station.mac
        }
    }
}

const setDoc = { 
    $push: {
        'stations.$.measures': station.measures
    }, 
    $set: { 
        'stations.$.lastUpdated': now,
        'stations.$.syncReadings': true,
        'stations.$.firstReadings': true,
        'stations.$.latestTemperature': station.measures.temperature,
        'stations.$.latestHumidity': station.measures.humidity
    }
}

User.findOne(query, elemMatch)
.exec()
.then(result => {
    console.log(result);
    if(result.stations.length > 0) {
        User.findOneAndUpdate({apiKey: query.apiKey, 'stations.stationName': station.stationName}, setDoc)
        .exec()
        .then(result => {
            res.status(200).send("Updated measures");
        })
        .catch(err =>{
            console.log(err);
            res.status(400).send(err)
        })
    } else if(result.stations.length == 0) {
        res.status(400).send("Station not found!")
    } else {
        res.status(400).send("Some error updating measures")
    }
})
.catch(err =>{
    console.log(err);
    res.status(400).send(err)
})
});

Моя стратегия, описанная выше, заключалась в том, что я не смог объединить запрос с $ elemMatch и затем обновить. Может ли кто-нибудь помочь мне улучшить мой код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...