Как запросить один документ из коллекции Mongodb с помощью реакции - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать панель поиска с реагирующим внешним интерфейсом и внутренним узлом узла, которая позволит мне искать идентификатор клиента из коллекции mongoDB, а затем извлекать все данные из одного документа изнутри коллекции и отображатьэто на моем приложении реагировать.

В настоящее время я просто пытаюсь заставить работать один бит документа, если это возможно.На данный момент это рушит всю коллекцию.

Мой текущий код узла:

Поиск маршрутизатора

const express = require('express');
const app = express();
const tfiPaintCodesRouter = express.Router();

const PaintInfoSchema = require('../models/PaintInfoSchema.js');

tfiPaintCodesRouter.route('/get').get(function (req, res) {
  const tfipaintcode = new PaintInfoSchema(req.body);
  console.log(req.body)
  tfipaintcode.save()
    .then(tfipaintcode => {
        res.json('Got data!!');
    })
    .catch(err => {
    res.status(400).send("unable to get data");
    console.log('CustomerID is required', err.res);
    });
});

tfiPaintCodesRouter.route('/').get(function (req, res) {
    PaintInfoSchema.find(function (err, tfipaintcodes){
    if(err){
      console.log('this is an error!', err.res);
    }
    else {
      res.json(tfipaintcodes);
    }
  });
});

module.exports = tfiPaintCodesRouter;

Схема Монго с использованием mongoose.

const mongoose = require('mongoose')
var uniqueValidator = require('mongoose-unique-validator');
const Schema = mongoose.Schema;

  // Create schema
 const PaintInfoSchema =  new Schema({
        customerID: {
            required: true,
            index: true,
            unique: true,
            type: String
        },
        companyName: {
            index: true,
            type: String
        },
        curtainCodes: {
            index: true,
            type: String
        },
        sinageCodes: {
            index: true,
            type: String
        },
        Notes: {
            index: true,
            type: String
        },
        Method: {
            index: true,
            type: String
        },
    },{
      collection: 'tfiPaintCodes'
    });
PaintInfoSchema.plugin(uniqueValidator);
module.exports = mongoose.model('PaintInfoSchema', PaintInfoSchema)

Мой текущий код реакции:

import React from 'react';
import {  Form, FormGroup, Input, Container, Row, Col } from 'reactstrap';
import './Search.css'
import axios from 'axios'

class Search extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
          searchInfo: []
    };  
  }

  handleInputChange = (event) => {
    event.preventDefault();
    const { value } = event.target;
    console.log('Value', value)
    this.setState({
      query: value
    });

    this.search(value);

  };

  search = query => {
      axios.get('http://localhost:3001/getData')
       .then(res =>{
        const searchInfo = (res.data || []).map(obj => ({ 
          company: obj.companyName,
          sinage: obj.sinageCodes,
          method: obj.Method,
          notes: obj.Notes}));


          this.setState({ searchInfo });
       })
    };

  componentDidMount() {
    this.search("");
  }

    render() {
        return(
            <Container>
                 <Form>
                    <Row>
                        <Col md={{ size: 6 ,offset: 3}}>
                            <FormGroup className="SearchBar">
                              <Input onChange={this.handleInputChange} type="search" name="search" id="exampleSearch" placeholder="search" />
                            </FormGroup>
                        </Col>
                    </Row>

                </Form>
       <ul>
        {this.state.searchInfo.map(function(searchInfo, index){
          return (
              <div key={index}>
                <h1>NAME: {searchInfo.company}</h1>
                <p>{searchInfo.sinage}</p>
                <p>{searchInfo.method}</p>
                <p>{searchInfo.notes}</p>
              </div>
            )
          }
        )}
      </ul>
            </Container>
        );
      }
    }
export default Search

Приведенный выше код запрашивает mongodb, затем извлекает все данные, хранящиеся в моей коллекции, вот изображение возвращенных данных.

Данные отображаются во внешнем интерфейсе

image

Но я хочу знать, возможно ли просто свернуть один документ в этой коллекции, поэтому он будет отображать только одно имя, а затем остальные 4 бита данных.

У меня есть данные, хранящиеся в Mlab, вот скриншот документов, хранящихся в моей коллекции.

данные в mongodb image

Это возможно?Спасибо!

1 Ответ

0 голосов
/ 18 сентября 2018

Лучший способ - извлечь из БД только один документ (если вам больше не нужно).

Mongoose, как и любой другой ORM / ODM, предоставляет следующие возможности:

https://mongoosejs.com/docs/api.html#model_Model.findOne

С помощью FindOne вы можете искать документы, но получить только один (он же «первый найденный») документ. Если вам требуется фиксированное количество возвращаемых документов, вы можете использовать limit(10), например, чтобы вернуть только 10 документов.

Хотя мне кажется, что ваши фрагменты кода не показывают точный сегмент, где выполняется запрос в Mongoose, в противном случае мы могли бы показать вам, что делать в вашем собственном примере.

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