복붙노트

[MONGODB] 2 차원 지리 지수 제대로 몽구스 스키마의 배열에 객체를 정의하는 방법

MONGODB

2 차원 지리 지수 제대로 몽구스 스키마의 배열에 객체를 정의하는 방법

나는 현재 아래의 문서에 대한 스키마를 만드는 데 문제가 있습니다. 서버의 응답은 항상 [오브젝트]로 "TRK"필드 값을 반환합니다. 어떻게 든 나는 나에게 의미가 만든 적어도 모든 방법을 시도,이 작동하는 방법을 몰라 ;-)

이 도움이된다면, 내 몽구스 버전은 3.6.20와 MongoDB를 2.4.7입니다 나는 잊어 버리기 전에, 그것은 또한 인덱스로 설정하는 것이 좋을 것이다 (2D)

원본 데이터 :

{
    "_id": ObjectId("51ec4ac3eb7f7c701b000000"),
    "gpx": {
        "metadata": {
            "desc": "Nürburgring VLN-Variante",
            "country": "de",
            "isActive": true
        },
    "trk": [
    {
        "lat": 50.3299594,
        "lng": 6.9393006
    },
    {
        "lat": 50.3295046,
        "lng": 6.9390688
    },
    {
        "lat": 50.3293714,
        "lng": 6.9389939
    },
    {
        "lat": 50.3293284,
        "lng": 6.9389634
    }]
    }
}

몽구스 스키마 :

var TrackSchema = Schema({
            _id: Schema.ObjectId,
            gpx: {
                metadata: {
                    desc: String,
                    country: String,
                    isActive: Boolean
                },
                trk: [{lat:Number, lng:Number}]
            }
        }, { collection: "tracks" });

크롬에서 네트워크 탭의 응답은 항상 (잘못된 경우에만 TRK-부분이) 다음과 같다 :

{ trk: 
      [ [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object],

나는 이미 "TRK"에 대한 서로 다른 스키마 정의를 시도했다 :

당신이 날 도울 수 있기를 바랍니다 ;-)

해결법

  1. ==============================

    1.다음과 같은 방법에 의해 TRK를 선언 할 수 있습니다 : - 어느 한 쪽

    다음과 같은 방법에 의해 TRK를 선언 할 수 있습니다 : - 어느 한 쪽

    trk : [{
        lat : String,
        lng : String
         }]
    

    또는

    TRK : {유형 : 배열, "기본": []}

    삽입 중에 두 번째 경우에서 개체를 확인하고 같은 배열로 밀어

    db.update({'Searching criteria goes here'},
    {
     $push : {
        trk :  {
                 "lat": 50.3293714,
                 "lng": 6.9389939
               } //inserted data is the object to be inserted 
      }
    });
    

    또는 당신에 의해 객체의 배열을 설정할 수 있습니다

    db.update ({'seraching criteria goes here ' },
    {
     $set : {
              trk : [ {
                         "lat": 50.3293714,
                         "lng": 6.9389939
                      },
                      {
                         "lat": 50.3293284,
                         "lng": 6.9389634
                      }
                   ]//'inserted Array containing the list of object'
          }
    });
    
  2. ==============================

    2.나는 몽구스와 유사한 문제가 있었다 :

    나는 몽구스와 유사한 문제가 있었다 :

    fields: 
        [ '[object Object]',
         '[object Object]',
         '[object Object]',
         '[object Object]' ] }
    

    사실, 나는 내 스키마에있는 속성 이름으로 "유형"을 사용했다 :

    fields: [
        {
          name: String,
          type: {
            type: String
          },
          registrationEnabled: Boolean,
          checkinEnabled: Boolean
        }
      ]
    

    이 문제를 방지하려면, 당신은 매개 변수를 변경해야합니다 :

    fields: [
        {
          name: String,
          type: {
            type: { type: String }
          },
          registrationEnabled: Boolean,
          checkinEnabled: Boolean
        }
      ]
    
  3. ==============================

    3.답장 주셔서 감사합니다.

    답장 주셔서 감사합니다.

    나는 첫 번째 방법을 시도했지만 아무것도 변경되지 않습니다. 그럼, 그 결과를 기록했습니다. 내가 마지막으로 데이터가 표시되는 된 위치에 도착 할 때까지 난 그냥 레벨로 레벨을 드릴 다운.

    잠시 내가 문제를 발견 한 후 : 내가 응답을 보낼 때, 나는로 .toString를 통해 문자열로 변환되었다 ().

    그 고정 지금은 훌륭하게 작동합니다. 거짓 경보 죄송합니다.

  4. ==============================

    4.내가 해결해야 할 문제는 매장 몇 가지 필드를 포함하는 계약 (주소, 책, NUM_OF_DAYS, borrower_addr, blk_data)이며, blk_data는 트랜잭션 목록 (블록 번호와 거래 주소)입니다. 이 질문에 대한 대답은 나를 도왔다. 나는 아래로 내 코드를 공유하고 싶습니다. 도움이 되었기를 바랍니다.

    내가 해결해야 할 문제는 매장 몇 가지 필드를 포함하는 계약 (주소, 책, NUM_OF_DAYS, borrower_addr, blk_data)이며, blk_data는 트랜잭션 목록 (블록 번호와 거래 주소)입니다. 이 질문에 대한 대답은 나를 도왔다. 나는 아래로 내 코드를 공유하고 싶습니다. 도움이 되었기를 바랍니다.

    var ContractSchema = new Schema(
        {
            address: {type: String, required: true, max: 100},  //contract address
            // book_id: {type: String, required: true, max: 100},  //book id in the book collection
            book: { type: Schema.ObjectId, ref: 'clc_books', required: true }, // Reference to the associated book.
            num_of_days: {type: Number, required: true, min: 1},
            borrower_addr: {type: String, required: true, max: 100},
            // status: {type: String, enum: ['available', 'Created', 'Locked', 'Inactive'], default:'Created'},
    
            blk_data: [{
                tx_addr: {type: String, max: 100}, // to do: change to a list
                block_number: {type: String, max: 100}, // to do: change to a list
            }]
        }
    );
    
    // Post submit a smart contract proposal to borrowing a specific book.
    exports.ctr_contract_propose_post = [
    
        // Validate fields
        body('book_id', 'book_id must not be empty.').isLength({ min: 1 }).trim(),
        body('req_addr', 'req_addr must not be empty.').isLength({ min: 1 }).trim(),
        body('new_contract_addr', 'contract_addr must not be empty.').isLength({ min: 1 }).trim(),
        body('tx_addr', 'tx_addr must not be empty.').isLength({ min: 1 }).trim(),
        body('block_number', 'block_number must not be empty.').isLength({ min: 1 }).trim(),
        body('num_of_days', 'num_of_days must not be empty.').isLength({ min: 1 }).trim(),
    
        // Sanitize fields.
        sanitizeBody('*').escape(),
        // Process request after validation and sanitization.
        (req, res, next) => {
    
            // Extract the validation errors from a request.
            const errors = validationResult(req);
            if (!errors.isEmpty()) {
                // There are errors. Render form again with sanitized values/error messages.
                res.status(400).send({ errors: errors.array() });
                return;
            }
    
            // Create a Book object with escaped/trimmed data and old id.
            var book_fields =
                {
                    _id: req.body.book_id, // This is required, or a new ID will be assigned!
                    cur_contract: req.body.new_contract_addr,
                    status: 'await_approval'
                };
    
            async.parallel({
                //call the function get book model
                books: function(callback) {
                    Book.findByIdAndUpdate(req.body.book_id, book_fields, {}).exec(callback);
                },
            }, function(error, results) {
                if (error) {
                    res.status(400).send({ errors: errors.array() });
                    return;
                }
    
                if (results.books.isNew) {
                    // res.render('pg_error', {
                    //     title: 'Proposing a smart contract to borrow the book',
                    //     c: errors.array()
                    // });
                    res.status(400).send({ errors: errors.array() });
                    return;
                }
    
                var contract = new Contract(
                    {
                        address: req.body.new_contract_addr,
                        book: req.body.book_id,
                        num_of_days: req.body.num_of_days,
                        borrower_addr: req.body.req_addr
    
                    });
    
                var blk_data = {
                        tx_addr: req.body.tx_addr,
                        block_number: req.body.block_number
                    };
                contract.blk_data.push(blk_data);
    
                // Data from form is valid. Save book.
                contract.save(function (err) {
                    if (err) { return next(err); }
                    // Successful - redirect to new book record.
                    resObj = {
                        "res": contract.url
                    };
                    res.status(200).send(JSON.stringify(resObj));
                    // res.redirect();
                });
    
            });
    
        },
    ];
    
    // Post lender accept borrow proposal.
    exports.ctr_contract_propose_accept_post = [
    
        // Validate fields
        body('book_id', 'book_id must not be empty.').isLength({ min: 1 }).trim(),
        body('contract_id', 'book_id must not be empty.').isLength({ min: 1 }).trim(),
        body('tx_addr', 'tx_addr must not be empty.').isLength({ min: 1 }).trim(),
        body('block_number', 'block_number must not be empty.').isLength({ min: 1 }).trim(),
    
        // Sanitize fields.
        sanitizeBody('*').escape(),
        // Process request after validation and sanitization.
        (req, res, next) => {
    
            // Extract the validation errors from a request.
            const errors = validationResult(req);
            if (!errors.isEmpty()) {
                // There are errors. Render form again with sanitized values/error messages.
                res.status(400).send({ errors: errors.array() });
                return;
            }
    
            // Create a Book object with escaped/trimmed data
            var book_fields =
                {
                    _id: req.body.book_id, // This is required, or a new ID will be assigned!
                    status: 'on_loan'
                };
    
            // Create a contract object with escaped/trimmed data
            var contract_fields = {
                $push: {
                    blk_data: {
                        tx_addr: req.body.tx_addr,
                        block_number: req.body.block_number
                    }
                }
            };
    
            async.parallel({
                //call the function get book model
                book: function(callback) {
                    Book.findByIdAndUpdate(req.body.book_id, book_fields, {}).exec(callback);
                },
                contract: function(callback) {
                    Contract.findByIdAndUpdate(req.body.contract_id, contract_fields, {}).exec(callback);
                },
            }, function(error, results) {
                if (error) {
                    res.status(400).send({ errors: errors.array() });
                    return;
                }
    
                if ((results.book.isNew) || (results.contract.isNew)) {
                    res.status(400).send({ errors: errors.array() });
                    return;
                }
    
                var resObj = {
                    "res": results.contract.url
                };
                res.status(200).send(JSON.stringify(resObj));
            });
        },
    ];
    
  5. from https://stackoverflow.com/questions/19695058/how-to-define-object-in-array-in-mongoose-schema-correctly-with-2d-geo-index by cc-by-sa and MIT license