2d जियो इंडेक्स के साथ Mongoose स्कीमा में ऑब्जेक्ट को सही तरीके से कैसे परिभाषित किया जाए


113

मुझे वर्तमान में नीचे दिए गए दस्तावेज़ के लिए एक स्कीमा बनाने में समस्या हो रही है। सर्वर से प्रतिक्रिया हमेशा "trk" फ़ील्ड मानों को [ऑब्जेक्ट] के रूप में वापस करती है। किसी तरह मुझे नहीं पता कि यह कैसे काम करना चाहिए, क्योंकि मैंने कम से कम सभी तरीकों की कोशिश की, जो मेरे लिए समझ में आया; ;-)

यदि यह मदद करता है, तो मेरा Mongoose संस्करण 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" });

Chrome में नेटवर्क टैब से प्रतिक्रिया हमेशा इस तरह दिखती है (यह केवल ट्रक-पार्ट है जो गलत है):

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

मैंने पहले ही "trk" के लिए विभिन्न स्कीमा परिभाषाएँ आज़मा ली हैं:

  1. trk: Schema.Types.Mixed
  2. trk: [स्कीमा.टाइप्स.मिक्सड]
  3. trk: [{type: [संख्या], इंडेक्स: "2d"}]

क्या आपसे मुझे मदद मिल सकती है ;-)

जवाबों:


219

आप निम्न तरीकों से trk की घोषणा कर सकते हैं: - या तो

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

किसी भी विचार कैसे इस तरह के मामले में html क्षेत्रों का नाम है यानी मामले में हम डेटाबेस में जावास्क्रिप्ट वस्तुओं की एक सरणी स्टोर करने की आवश्यकता है? उदाहरण के लिए खेतों में trk.latऔर trk.lnghtml अभ्यस्त कामों के नामकरण के लिए।
रायसा

3
trk: {type: Array, "default": []} मेरे लिए सबसे अच्छा काम करता है! यह सरल और सुरुचिपूर्ण है!
21

1
@DpGeek यदि आप उस प्रारूप में सरणी घोषित कर रहे हैं, तो आप सरणी फ़ील्ड को सीधे अपडेट नहीं कर सकते। सीधे ऐरे को अपडेट करने के लिए मैंने {lat: स्ट्रिंग, lng: स्ट्रिंग} सब्स्क्लेमा का उपयोग किया। यदि आप वह सुविधा नहीं चाहते हैं तो trk: {type: Array, "default": []} सबसे अच्छा होगा अन्यथा आपको subschema घोषित करना होगा।
कुंडू

डिफ़ॉल्ट उद्धरण के बिना मेरे लिए काम कियाtrk : { type : Array , default : ['item1', 'item2'] }
शार्दुल

1
यह तब भी काम करेगा जब स्ट्रिंग के बजाय 'लैट' और 'लैंग' फील्ड को नंबर के रूप में परिभाषित किया गया है?
jimijazz

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
हाँ, इसके बारे में भी नहीं सोचा था। इससे पहले कि मैं अपनी डेस्क हाहा धन्यवाद पर फिर से स्लैमिंग सामान शुरू करने वाला था, उससे पहले ही मेरी समस्या हल हो गई। मैं अभी से अपने मैंगोज स्कीमा में 'टाइप' से बचने जा रहा हूं।
ब्लैकप्लस

क्या आप उस जसन का उदाहरण दे सकते हैं जिसे आप सम्मिलित करने का प्रयास कर रहे थे?
ओवेन्समार्टिन

1
या आप टाइप
स्कीम

2

उत्तर के लिए धन्यवाद।

मैंने पहले दृष्टिकोण की कोशिश की, लेकिन कुछ भी नहीं बदला। फिर, मैंने परिणामों को लॉग करने का प्रयास किया। मैंने स्तर को स्तर से नीचे गिरा दिया, जब तक कि मैं अंत में वहां नहीं पहुंच गया जहां डेटा प्रदर्शित किया जा रहा था।

थोड़ी देर बाद मुझे समस्या मिली: जब मैं प्रतिक्रिया भेज रहा था, तो मैं इसे स्ट्रिंग के माध्यम से परिवर्तित कर रहा था .toString()

मैंने तय किया कि और अब यह शानदार ढंग से काम करता है। झूठे अलार्म के लिए क्षमा करें।


1

समस्या को हल करने के लिए मुझे कुछ फ़ील्ड्स (पता, पुस्तक, num_of_days, उधारकर्ता_आधार, blk_data) वाले अनुबंधों को संग्रहीत करना है, blk_data एक लेनदेन सूची (ब्लॉक नंबर और लेनदेन पता) है। इस सवाल और जवाब ने मेरी मदद की। मैं नीचे अपना कोड साझा करना चाहूंगा। उम्मीद है की यह मदद करेगा।

  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. MongoDB में संग्रह के लिए एक रिकॉर्ड बनाएं। देखें 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));
        });
    },
];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.