2 ডি জিও সূচক সহ সঠিকভাবে মোঙ্গুজ স্কিমাতে অ্যারেতে কীভাবে বস্তুর সংজ্ঞা দেওয়া যায়


113

নীচের নথির জন্য একটি স্কিমা তৈরি করতে আমার বর্তমানে সমস্যা হচ্ছে। সার্ভারের প্রতিক্রিয়া সর্বদা "অবজেক্ট" হিসাবে "trk" ক্ষেত্রের মানগুলি প্রদান করে। এটি কীভাবে কাজ করা উচিত তা কোনওভাবেই আমার ধারণা নেই, যেমন আমি অন্তত এমন সমস্ত পদ্ধতির চেষ্টা করেছি যা আমার কাছে বোধগম্য হয়েছিল ;-)

এটি যদি সহায়তা করে তবে আমার মঙ্গুজ সংস্করণটি 3.6.20 এবং মঙ্গোডিবি 2.4.7 এবং আমি ভুলে যাওয়ার আগে এটি সূচক (2 ডি) হিসাবে সেট করা ভাল লাগবে

আসল তথ্য:

{
    "_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: 
      [ [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object],

"ট্রেক" এর জন্য আমি ইতিমধ্যে বিভিন্ন স্কিমা সংজ্ঞা চেষ্টা করেছি:

  1. ট্রেক: স্কিমা.টাইপস.মিক্সড
  2. ট্রেক: [স্কিমা.টাইপস.মিক্সড]
  3. ট্রেকে: [{প্রকার: [সংখ্যা], সূচক: "2 ডি"}]

আশা করি তুমি আমাকে সাহায্য করতে পারবে ;-)

উত্তর:


219

আপনি নিম্নলিখিত উপায়ে ট্রেক ঘোষণা করতে পারেন: - হয় হয়

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

অথবা

trk : { type : Array , "default" : [] }

সন্নিবেশের সময় দ্বিতীয় ক্ষেত্রে অবজেক্টটি তৈরি করুন এবং এটির মতো অ্যারেতে চাপ দিন

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'
      }
});

এই জাতীয় ক্ষেত্রে যেমন এইচটিএমএল ক্ষেত্রের নামকরণের কোনও ধারণা যেমন ক্ষেত্রে আমাদের যদি ডাটাবেসে জাভাস্ক্রিপ্ট অবজেক্টগুলির একটি অ্যারে সঞ্চয় করা দরকার? যেমন যেমন নামকরণ ক্ষেত্রের জন্য trk.latএবং trk.lngএইচটিএমএল অভ্যস্ত কাজে।
রাইসাআ

3
trk: {প্রকার: অ্যারে, "ডিফল্ট": []! আমার পক্ষে সবচেয়ে ভাল কাজ করে! এটি সহজ এবং মার্জিত!
সর্পিলমুন

1
@ ডিপিজিক আপনি যদি সেই ফর্ম্যাটে অ্যারে ঘোষণা করে থাকেন তবে আপনি সরাসরি অ্যারে ক্ষেত্রটি আপডেট করতে পারবেন না। অ্যারেটি আপডেট করতে আমি সরাসরি ব্যবহার করেছি {ল্যাট: স্ট্রিং, এলএনজি: স্ট্রিং che সাবচেমা। আপনি যদি সেই সুবিধাটি না চান তবে ট্রেকে: {প্রকার: অ্যারে, "ডিফল্ট": []। সেরা হবে অন্যথায় আপনাকে সাবস্কিমা ঘোষণা করতে হবে।
কুন্ডু

কোট ছাড়াই ডিফল্ট আমার জন্য কাজ করেছেtrk : { type : Array , default : ['item1', 'item2'] }
শারদুল

1
'ল্যাট' এবং 'এলএনজি' ক্ষেত্রগুলি স্ট্রিংয়ের পরিবর্তে সংখ্যা হিসাবে সংজ্ঞায়িত হলে এটি এখনও কাজ করবে?
জিমিজাজ

63

মঙ্গুজের সাথে আমারও একই সমস্যা ছিল:

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
    }
  ]

4
হ্যাঁ, এটি সম্পর্কে ভাবেনি। আমি আমার ডেস্কে স্ট্যাম্পিং স্টাফ শুরু করতে যাবার ঠিক আগেই এটি আমার সমস্যার সমাধান করেছে হাহাহা ধন্যবাদ thanks আমি এখন থেকে আমার মঙ্গুজের স্কিমাগুলিতে 'টাইপ' এড়াতে যাচ্ছি।
ব্ল্যাকপস

আপনি যে জসনটি sertোকানোর চেষ্টা করছেন তার একটি উদাহরণ দিতে পারেন?
owensmartin

1
অথবা আপনি টাইপ কী বিকল্পটি আপনার স্কিমা নির্মাতার কাছে প্রকারের ঘোষণাকে ওভাররাইড করতে
পারতেন

2

উত্তরের জন্য ধন্যবাদ।

আমি প্রথম পদ্ধতির চেষ্টা করেছি, কিন্তু কিছুই পরিবর্তন হয়নি। তারপরে, আমি ফলাফলগুলি লগ করার চেষ্টা করেছি। আমি মাত্র স্তরে স্তরে ড্রিল করেছি, অবশেষে আমি যেখানে তথ্য প্রদর্শিত হচ্ছে সেখানে পৌঁছে না দেওয়া পর্যন্ত।

কিছুক্ষণ পরে আমি সমস্যাটি খুঁজে পেলাম: যখন আমি প্রতিক্রিয়া পাঠাচ্ছিলাম তখন আমি এটিকে স্ট্রিংয়ের মাধ্যমে রূপান্তর করছিলাম .toString()

আমি এটি স্থির করেছি এবং এখন এটি দুর্দান্তভাবে কাজ করে। মিথ্যা এলার্ম জন্য দুঃখিত।


1

আমার যে সমস্যাটি সমাধান করতে হবে তা হ'ল কয়েকটি ক্ষেত্র (ঠিকানা, পুস্তক, num_of_days, orণগ্রহী_আড্ডার, ব্লক_ডাটা), ব্লক_ডেটা একটি লেনদেনের তালিকা (ব্লক নম্বর এবং লেনদেনের ঠিকানা) store এই প্রশ্নোত্তর আমাকে সাহায্য করেছিল। আমি নীচের মত আমার কোড ভাগ করতে চাই। আশাকরি এটা সাহায্য করবে.

  1. স্কিমার সংজ্ঞা। 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
        }]
    }
);
  1. মঙ্গোডিবিতে সংগ্রহের জন্য একটি রেকর্ড তৈরি করুন। Blk_data দেখুন।
// 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();
            });

        });

    },
];
  1. একটি রেকর্ড আপডেট করুন। Blk_data দেখুন।
// 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));
        });
    },
];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.