2012-09-15 61 views
1

我收藏的內容都是以這種形式,Mongodb/PHP如何在嵌套數組中插入(如果不存在)?

{ "_id" : ObjectId("50535036381ef82c08000002"),"source_references" : [ 
    { 
      "_id" : ObjectId("50535036381ef82c08000001"), 
      "name" : "abc", 
      "key" : "123" 
    }] 
} 

現在我要插入的「source_references」另一個數組如果用戶名和密鑰不嵌套數組中存在其他不插。下面是結果我想,

{ "_id" : ObjectId("50535036381ef82c08000002"),"source_references" : [ 
    { 
      "_id" : ObjectId("50535036381ef82c08000001"), 
      "name" : "abc", 
      "key" : "123" 
    } 
    { 
      "_id" : ObjectId("50535036381ef82c08000003"), 
      "name" : "reuters", 
      "key" : "139215" 
    }] 
} 

這裏是我已經試過:

$Update_tag = array('$addToSet' => array("source_references.$" => array("name" => "reuters", "key" => $r_id))); 
$mycollection->update(array("_id" => $id), $Update_tag); 

但我不能夠插入嵌套數組內的另一個數組。此外,我只想創建「_id」字段(在嵌套數組內),只需在source_references中插入新數組。

在哪裏,我錯了?希望我清楚我的問題。

+0

您是否收到任何錯誤信息或只是錯誤的結果? –

+0

我沒有收到任何錯誤消息。只是更新不會發生。 @JoachimIsaksson – user1518659

+0

一些事情要先檢查;你在創建數組時會拼寫'soruce_references。$'錯誤,並且在預期結果中有'_id'(路由器和根)的重複。 –

回答

2

這很棘手,因爲每個子文檔都有唯一的關鍵字。因此,您不能使用$ elemMatch來檢查密鑰/名稱對是否已經存在。

如果您正在運行mongodb 2.2,則可以使用聚合框架來展開嵌套數組,然後$匹配鍵/名稱對,並且僅當搜索返回空時插入新元素。

這是PHP代碼:

<?php 

// connect 
$m = new Mongo('localhost:27017'); 

// select a database and collection 
$db = $m->test; 
$collection = $db->coll; 

// sub-doc to insert if key/name pair doesn't exist 
$doc = array('key'=>'12345', 'name' => 'abcde'); 

// aggregation command (can use $collection->aggregate for driver version 1.3.0+) 
$cursor = $db->command(array('aggregate' => 'coll', 'pipeline' => array(
    array('$unwind'=>'$source_references'), 
    array('$match' => array('source_references.name' => $doc['name'], 
          'source_references.key' => $doc['key'])) 
))); 

// if sub-doc doesn't exist, insert into main doc with this objectId 
$objectId = '50535036381ef82c08000002'; 

if (count($cursor['result']) == 0) { 
    // insert document with a new ObjectId (MongoId) 
    $update_tag = array('$addToSet' => array("source_references" => array("_id" => new MongoId(), "name" => $doc['name'], "key" => $doc['key']))); 
    $collection->update(array("_id" => new MongoId($objectId)), $update_tag); 
} 

?> 
+0

之前感謝您的答案進一步。你能否詳細說明你的答案,以便我可以更多地理解?這個命令僅適用於mongo-db 2.2嗎? ..因爲我沒有運行mongodb-2.2。 – user1518659

+0

謝謝。那個人像個魅力一樣工作。 – user1518659

相關問題