Добавление данных внутри документов в Mongo DB с помощью PHP
Я хочу вставить данные в Mongo database
использование PHP скрипта, в year
мудрые документы, чтобы он мог выглядеть так (все годы в одном документе);
cars{
2017{
car=Motorolla
color = blue
}
2016{
car=Toyota
color = green
}
2015{
car=Corolla
color = black
}
}
Я хотел добавить документ, но он запрашивает
документ не может иметь $ prefixed имена полей: $years[0]
можно ли сделать такую схему в Mongo с помощью PHP?
код
<?php
try {
$car = 'Motorolla';
$color = 'blue';
//$car = 'Toyota';
//$color = 'green';
//$car = 'Corolla';
//$color = 'black';
$years = array(2017, 2016, 2015);
$manager = new MongoDBDriverManager("mongodb://localhost:27017");
$bulkWriteManager = new MongoDBDriverBulkWrite;
$document = ['_id' => new MongoDBBSONObjectID, '$years[0]' => $car, '$years[1]' => $color]; // Making a query type
try {
$bulkWriteManager->insert($document); // Inserting Document
echo 1;
} catch(MongoCursorException $e) {
/* handle the exception */
echo 0;
}
$manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager); // Going to DB and Collection
} catch (MongoDBDriverExceptionException $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";
}
?>
Я не хочу добавлять весь автомобиль немедленно возражайте. Я хочу добавить Year object
каждый раз. Любая помощь будет ощутима.
или
Любой относительный ответ, чтобы я мог получить данные от Mongo Database
Согласно году?
Edit1
впервые творение. - Кредиты идут на @Veeram
<?php
try {
$car = 'Malibu';
$color = 'red';
$years = array(2017);
$manager = new MongoDBDriverManager("mongodb://localhost:27017");
$bulkWriteManager = new MongoDBDriverBulkWrite;
//{"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) {
echo 0;
}
$manager->executeBulkWrite('dbName.mycol', $bulkWriteManager); // Going to DB and Collection
} catch (MongoDBDriverExceptionException $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";
echo "In file:", $e->getFile(), "n";
echo "On line:", $e->getLine(), "n";
}
?>
для обновления-кредиты идут на @Veeram
<?php
try {
$car = 'ChangedCar';
$color = 'changedColor';
$years = array(2017);
$manager = new MongoDBDriverManager("mongodb://localhost:27017");
$bulkWriteManager = new MongoDBDriverBulkWrite;
$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); // Inserting Document
} catch(MongoCursorException $e) {
}
$manager->executeBulkWrite('dbName.mycol', $bulkWriteManager); // Going to DB and Collection
} catch (MongoDBDriverExceptionException $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";
}
?>
проблема в этом коде заключается в том, что он успешно вставить данные в первый раз, но когда я обновляю данные не обновляет его.
пример:
Существует документ с именем cars
. Вставить данные с объектом года в один документ. Допустим, объект 2017 года, он содержит цвет и модель автомобиля. Как показано ниже; (несколько объектов с годами. Год уникален во всем документе.)
cars{
2017{
car=Motorolla
color = blue
}
2016{
car=Toyota
color = green
}
2015{
car=Corolla
color = black
}
}
если я хочу обновить, просто сделайте объект 2017
как 2017{car=Updated-Motorolla color =Updated-blue}
и вставить в документ. Он должен обновлять только объект 2017 года в стороне документа.
cars{
2017{
car=Updated-Motorolla
color =Updated-blue
}
2016{
car=Toyota
color = green
}
2015{
car=Corolla
color = black
}
}
2 ответов
вы можете попробовать что-то вроде этого. Невозможно выполнить все операции Mongo db только на основе ключа off в качестве значения.
первое решение написано, чтобы оставаться рядом с дизайном 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"});
PHP код:
//{"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";
}
?>
вы можете выполнить комплекс запросы с помощью конвейера агрегации, и вы можете добавить индекс, чтобы сделать ваш ответ быстрее.
замечания:
Первый Вариант : сложнее обновлять / вставлять данные, но сохраняет все вместе, поэтому легче читать данные.
Второй Вариант : Чище и проще выполнять операции CRUD над документами и использовать конвейер агрегации для предварительного формирования сложных запросов.
попробуйте изменить
$document = ['_id' => new MongoDB\BSON\ObjectID, '$years[0]' => $car, '$years[1]' => $color];
что-то вроде:
$document = ['_id' => new \MongoDB\BSON\ObjectID, $years[0] => ['car' => $car, 'color' => $color]];
это дает такой результат в монго:
{ "_id" : ObjectId("58a936ecfc11985f525a4582"), "2017" : { "car" : "Motorolla", "color" : "blue" }
если данные обо всех автомобилях должны быть в одном документе, вам нужно объединить данные fitst:
$cars = [
'2017' => [
'car' => 'Motorolla',
'color' => 'blue'
],
'2016' => [
'car' => 'Toyota',
'color' => 'green'
],
'2015' => [
'car' => 'Corolla',
'color' => 'black'
]
];
и
$document = ['_id' => new \MongoDB\BSON\ObjectID, 'cars' => $cars];
это дает монго документ, как:
{ "_id" : ObjectId("58aabc0cfc11980f57611832"), "cars" : { "2017" : { "car" : "Motorolla", "color" : "blue" }, "2016" : { "car" : "Toyota", "color" : "green" }, "2015" : { "car" : "Corolla", "color" : "black" } } }