Hi,
I found this weird issue where by I added another embedded document into a existing document it break down my embedded into two parts.
Here's an example class
PurchaseOrder
-———————————
/**
* @MongoDB\Document(collection="PurchaseOrder")
*/
class PurchaseOrder
{
/**
/**
* @MongoDB\Id(strategy="auto")
*/
protected $id;
/**
* @MongoDB\EmbedMany(targetDocument="Order")
*/
protected $purchaseOrder;
/**
* Add order
*
* @param Cereals\ProductBundle\Document\Order\Order $order
*/
public function addPurchaseOrder(\Cereals\ProductBundle\Document\Order\Order $order)
{
$this->order[] = $order;
}
/**
* Get order
*
* @return Doctrine\Common\Collections\Collection $order
*/
public function getOrder()
{
return $this->order;
}
}
Order
-———————————
/**
* @MongoDB\EmbeddedDocument
*/
class Order
{
/**
* @MongoDB\ReferenceOne(targetDocument="Test\VendorBundle\Document\Vendor")
*/
protected $vendor;
/**
* @MongoDB\String
* @var String
*/
protected $vendorName;
/**
* @MongoDB\EmbedMany(targetDocument="OrderItem")
*/
protected $orderItems=array();
/**
* Add orderItems
*
* @param Cereals\ProductBundle\Document\Order\OrderItem $orderItems
*/
public function addOrderItems(\Cereals\ProductBundle\Document\Order\OrderItem $orderItems)
{
$this->orderItems[] = $orderItems;
}
/**
* Get orderItems
*
* @return Doctrine\Common\Collections\Collection $orderItems
*/
public function getOrderItems()
{
return $this->orderItems;
}
}
I'm running Symfony2. So here's an what I run with the code below.
-———————————
$dm = $this->get('doctrine.odm.mongodb.document_manager');
$purchaseOrder = new PurchaseOrder();
$order = new Order();
$order->setVendorName(".....");
$orderItem = new OrderItem();
$order->addOrderItem($orderItem);
$purchaseOrder->addOrder($order);
$dm->persist($purchaseOrder);
$dm->flush();
The above give the result below, which is right.
db.PurchaseOrder.update({ "_id": ObjectId("4e3ed35d4fcfa90a08020000") }, { "$pushAll": { "order": [ { "vendor": { "$ref": "Vendor", "$id": ObjectId("4e3eb4a04fcfa9c005070000"), "$db": "test" }, "vendorName": "drugCompany" } ] } });
db.PurchaseOrder.update({ "_id": ObjectId("4e3ed35d4fcfa90a08020000") }, { "$pushAll": { "order.0.orderItems": [ {"productName": "Bifen Suspension", "productId": ObjectId("4e3eb4a04fcfa9c005090000") } ] } });
But If i add another embedded document with this code.
$dm = $this->get('doctrine.odm.mongodb.document_manager');
$purchaseOrder = $dm->getRepository('TestProductBundle:PurchaseOrder')->find("4e3ed35d4fcfa90a08020000");
$order = new Order();
$order->setVendorName(".....");
$orderItem = new OrderItem();
$order->addOrderItem($orderItem);
$purchaseOrder->addOrder($order);
$dm->persist($purchaseOrder);
$dm->flush();
It give a wrong order of execution of query.
db.PurchaseOrder.update({ "_id": ObjectId("4e3ed35d4fcfa90a08020000") }, { "$pushAll": { "order.1.orderItems": [ { "productName": ".....", "productSn": "....", "productId": ObjectId("4e3eb4a04fcfa9c0050a0000") } ] } });
db.PurchaseOrder.update({ "_id": ObjectId("4e3ed35d4fcfa90a08020000") }, { "$pushAll": { "order": [ { "vendor": { "$ref": "Vendor", "$id": ObjectId("4e3eb4a04fcfa9c005080000")}, "vendorName": "Health" } ] } });
Under PurchaseOrder embedded document for order has the follow.
- A embedded Order with vendorName and OrderItem.
- A embedded Order with OrderItem only
- A embedded Order with vendorName.