2

私のコレクションの内容はこの形式です、

{ "_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);

しかし、ネストされた配列内に別の配列を挿入することはできません。また、新しい配列がsource_referencesに挿入された場合にのみ、「_ id」フィールド(ネストされた配列内)を作成したいと思います。

どこが間違っているのですか?私の質問がはっきりしていることを願っています。

4

1 に答える 1

2

各サブドキュメントには一意のキーがあるため、これは注意が必要です。したがって、$ elemMatchを使用して、キーと名前のペアがすでに存在するかどうかを確認することはできません。

mongodb 2.2を実行している場合は、集計フレームワークを使用してネストされた配列を$ unwindし、キーと名前のペアを$ matchして、検索で空が返された場合にのみ新しい要素を挿入できます。

これは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);
} 

?>
于 2012-09-15T13:33:28.553 に答える