आप कुछ इस तरह की कोशिश कर सकते हैं। मान के रूप में केवल कुंजी के आधार पर सभी मोंगो डीबी संचालन करना संभव नहीं है।
पहला समाधान OP के डिजाइन के करीब रहने के लिए लिखा गया है।
मान लें कि आप year
में एक कुंजी जोड़ सकते हैं ।
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
वर्ष को इसके मूल्य से संदर्भित करना आसान बनाता है।
उदाहरण के लिए data
. में एक नया मान जोड़ने के लिए year
. के लिए सरणी 2017. आप नीचे दिए गए कोड को आजमा सकते हैं।
अद्यतन स्थितिगत $ का उपयोग करता है ऑपरेटर।
query
उस सरणी को संदर्भित करने के लिए भाग जहां 2017 रिकॉर्ड संग्रहीत है।
update
push
. का उपयोग कर भाग नई car
जोड़ने के लिए मौजूदा data
में रिकॉर्ड करें 2017
. के लिए सरणी पंक्ति।
<?php
try {
$car = 'Malibu';
$color = 'blue';
$years = [2017];
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$bulkWriteManager = new MongoDB\Driver\BulkWrite;
//{"cars.year":2017}
$query = ['cars.year' => $years[0]];
//{ $push: { "cars.$.data": { "car":"chevy", "color":"black"} }}
$update = ['$push'=> ['cars.$.data'=>['car' => $car, 'color' => $color]]];
try {
$bulkWriteManager->update($query, $update); // Update Document
echo 1;
} catch(MongoCursorException $e) {
/* handle the exception */
echo 0;
}
$manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager); // Going to DB and Collection
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
}
?>
साल के हिसाब से डेटा एक्सेस करने के लिए आप नीचे क्वेरी चला सकते हैं।
क्वेरी पोजिशनल $
का इस्तेमाल करें
क्वेरी भाग का उपयोग करके सरणी अनुक्रमणिका खोजने के लिए ऑपरेटर और प्रक्षेपण भाग में उस मान को संदर्भित करें।
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
वैकल्पिक समाधान:
यह सब कुछ सिर्फ इन्सर्ट के रूप में संभाल लेगा
बेहतर होगा कि आप प्रत्येक कार प्रविष्टि को उसके अपने दस्तावेज़ में सहेज लें।
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
प्रत्येक प्रविष्टि के लिए आप इसका उपयोग कर सकते हैं:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
पीएचपी कोड:
//{"car":"chevy", "color":"black", year: 2017}
$insert = ['car' => $car, 'color' => $color, 'year' => $years[0]];
try {
$bulkWriteManager - > insert($insert); // Inserting Document
echo 1;
} catch (MongoCursorException $e) {
/* handle the exception */
echo 0;
}
साल के हिसाब से एक्सेस डेटा के लिए आप उपयोग कर सकते हैं
db.collection.find({"year":2017});
अपडेट किया गया PHP कोड:
<?php
try {
$cars = ['Motorolla','Toyota', 'Corolla'] ;
$colors = ['blue', 'green', 'black'];
$years = [2017, 2016, 2015];
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$bulkWriteManager = new MongoDB\Driver\BulkWrite;
$query1 =["year" => $years[0]];
$query2 =["year" => $years[1]];
$query3 =["year" => $years[2]];
$update1 = ['$set' => ['car' => $cars[0], 'color' => $colors[0]]];
$update2 = ['$set' => ['car' => $cars[1], 'color' => $colors[1]]];
$update3 = ['$set' => ['car' => $cars[2], 'color' => $colors[2]]];
try {
$bulkWriteManager->update($query1, $update1, ["upsert" => true]);
$bulkWriteManager->update($query2, $update2, ["upsert" => true]);
$bulkWriteManager->update($query3, $update3, ["upsert" => true]);
echo 1;
} catch(MongoCursorException $e) {
/* handle the exception */
echo 0;
}
$manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager); // Going to DB and Collection
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
}
?>
आप एग्रीगेशन पाइपलाइन का उपयोग करके जटिल क्वेरी कर सकते हैं और अपनी प्रतिक्रिया को तेज़ करने के लिए इंडेक्स जोड़ सकते हैं।
टिप्पणियां:
पहला समाधान :डेटा को अपडेट/सम्मिलित करना कठिन है, लेकिन डेटा को पढ़ने के लिए सब कुछ एक साथ रखना इतना आसान है।
दूसरा समाधान :दस्तावेजों पर सीआरयूडी संचालन करने के लिए क्लीनर और सरल और जटिल प्रश्नों को पूर्ववत करने के लिए एकत्रीकरण पाइपलाइन का उपयोग करें।