[MONGODB] 2 차원 지리 지수 제대로 몽구스 스키마의 배열에 객체를 정의하는 방법
MONGODB2 차원 지리 지수 제대로 몽구스 스키마의 배열에 객체를 정의하는 방법
나는 현재 아래의 문서에 대한 스키마를 만드는 데 문제가 있습니다. 서버의 응답은 항상 [오브젝트]로 "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.다음과 같은 방법에 의해 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.나는 몽구스와 유사한 문제가 있었다 :
나는 몽구스와 유사한 문제가 있었다 :
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.답장 주셔서 감사합니다.
답장 주셔서 감사합니다.
나는 첫 번째 방법을 시도했지만 아무것도 변경되지 않습니다. 그럼, 그 결과를 기록했습니다. 내가 마지막으로 데이터가 표시되는 된 위치에 도착 할 때까지 난 그냥 레벨로 레벨을 드릴 다운.
잠시 내가 문제를 발견 한 후 : 내가 응답을 보낼 때, 나는로 .toString를 통해 문자열로 변환되었다 ().
그 고정 지금은 훌륭하게 작동합니다. 거짓 경보 죄송합니다.
-
==============================
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)); }); }, ];
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