Как найти записи JSON на основе пользователя?

#mongodb #react-native #express #mongoose #axios

Вопрос:

В приложении MERN iOS react-native как я могу запросить правильные записи JSON в Mongodb atlas на основе пользователя, который вошел в систему (т. Е. по электронной почте)? Основная особенность. Для конкретного примера найдите, сколько пользователь, вошедший в систему (электронная почта), прочитал в тот день (прочитал минуты), и отправьте его обратно в интерфейсе мобильного приложения. Вот соответствующий код:

При входе в систему они заполняют следующее (схема мангуста):

 /* user.model.js */
const userSchema = new Schema(
    {
        email: {
            type: String,
            required: true,
            unique: true,
            trim: true,
        },
        password: {
            type: String,
            required: true,
            trim: true,
            minlength: 6,
        },
    },
    {
        timestamps: true,
    }
);
const User = mongoose.model("User", userSchema);
 

Теперь, когда в приложении после входа в систему, они могут заполнить следующие записи (схема мангуста):

 /* log.model.js */
const logSchema = new Schema(
    {
        minutesRead: {
            type: number,
            required: true,
        },
        date: {
            type: Date,
            required: true,
        },
    },    
    {
        timestamps: true,
    }
);
const Log = mongoose.model("Log", logSchema);
 

Вот мой маршрут для регистрации минут.:

 const Log = require("../models/log.model");

router.route("/add").post((req, res) => {
    const minutesRead = req.body.minutesRead;
    // ..etc

    const newLog = new Log({ minutesRead, /* ..etc */ });

    newLog.save().then(() => res.json("Log added")).catch(error => //throw error);
}
 

А теперь покажите конкретные данные minutesRead вошедшего в систему пользователя во внешнем интерфейсе:

 /* Home.js screen */
const url = "http://localhost....";

const home = ({ navigation }) => {
    const [totalMinutesRead, setMinutes] = React.useState("");

    axios.get(url).then(response => {
       setMinutes(() => { 
           /* sum all of user's minutesRead entries in a loop here */
       });
    });

    return (
        <View>
            <Text>{totalMinutesRead}</Text>
        </View>
    )
};
 

Ответ №1:

Вам нужен способ узнать, какой журнал от какого пользователя.

На мой взгляд, лучший способ сделать это-добавить поле пользователя в схему журналов:

 user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
}]
 

В вашем

маршрут для протоколирования минутпоТока

Вам нужно ввести идентификатор пользователя в теле.

Затем, чтобы получить totalMinutesRead, вам нужно будет сделать что-то подобное, чтобы отфильтровать по идентификатору пользователя.

 router.route('getTotalMinutes/:user').get(async (req, res) => {
    const logs = await Log.find({ user: req.params.user });

    const totalMinutes = logs.reduce((total, log) => total   log.minutesRead, 0);

    res.json({ totalMinutes });
}
 

Наконец, в react-native убедитесь, что вы передали идентификатор своего пользователя в URL-адресе.

Комментарии:

1. Таким образом, серверная часть должна выполнить вычисление суммирования для minutesRead (в примере) ? В настоящее время у меня есть интерфейс, как вы можете видеть. Как интерфейс затем получает доступ к TotalMinutes для res.json({TotalMinutes}) ?

2. Вы можете сделать это либо на интерфейсе, либо на бэкэнде, это зависит от вас. Если вы сделаете это на задней панели, спереди вы можете настроить параметры setMinutes на response.TotalMinutes. Если вы хотите сделать это спереди, то вам нужно передать все документы, поэтому res будет чем-то вроде res.json({ данные: журналы })

3. Спасибо Начо, однако это все еще не работает. Я думаю, проблема в том, что я не понимаю, почему я бы «передал идентификатор пользователя в теле», когда они (фактический пользователь приложения) не вводят эти данные во внешний интерфейс. Им никогда не запрашивают эту информацию. Если я console.log (), эта переменная, когда я попытаюсь, окажется неопределенной, как я и ожидал. Я предполагаю, что под этим, конечно, вы подразумеваете const user = req.body.user router.route('/add').post() раздел.

4. Вы можете получить идентификатор пользователя в ответе, когда он войдет в систему. Другой способ-использовать электронную почту пользователя. В вашем logSchema : email: { type: string } . Затем в getTotalMinutes : const logs = await Log.find({ email: req.params.user })