2014-01-10 42 views
1

我有兩個日期字段:DATE_START和DATE_END更新UPSERT:DATE_START場

$criteria = [ 
    '_id'=>$data->thread, 
    'download_id'=>$data->id, 
    'ip'=>new MongoInt32(Helper::aton($data->remote_addr)), 
]; 

$status = $nodeThreadsCollection->update($criteria, 
    [ 
     '$set'=>[ 
      'disconnected'=>(bool)$data->disconnected, 
      'date_end'=>new MongoDate(), 
     ], 
     '$inc'=>[ 
      'bytes_send'=>new MongoInt64($data->bytes_send), 
     ] 
    ],[ 
     'upsert'=>true, 
     'w'=>1, 
    ] 
); 

if(isset($status['updatedExisting']) && !$status['updatedExisting']) { 
    $nodeThreadsCollection->update($criteria, 
     [ 
      '$set'=>[ 
       'date_start'=>new MongoDate(), 
      ], 
     ],[ 
      'w'=>0, 
     ] 
    ); 
} 

但它需要writeConcern = 1用於獲取插入狀態並進行二次查詢。 如何在一個查詢中創建它?

+0

嗯沒有辦法有條件根據MongoDB本身中另一部分查詢的結果編寫date_start,因此我認爲兩個查詢是你必須做的,除非當然可以設置date_start,只要 – Sammaye

+1

啊等待你想要一個$ setOnInsert:http: //docs.mongodb.org/manual/refere nce/operator/update/setOnInsert /我相信 – Sammaye

+0

謝謝,不要期待在這裏見到你;) – Hett

回答

4

爲了一氣呵成要做到這一點,你可以這樣做:

<?php 
/* Just random test setup */ 
$m = new MongoClient; 
$nodeThreadsCollection = $m->test->test; 

$data = new StdClass; 
$data->thread = 5; 
$data->id = 88; 
$data->remote_addr = 76123123; 
$data->disconnected = true; 
$data->bytes_send = 7234; 
*/ 

$criteria = [ 
    '_id'=>$data->thread, 
    'download_id'=>$data->id, 
    'ip'=>new MongoInt32($data->remote_addr), 
]; 

$status = $nodeThreadsCollection->update($criteria, 
    [ 
     '$set'=>[ 
      'disconnected'=>(bool)$data->disconnected, 
      'date_end'=>new MongoDate(), 
     ], 
     '$setOnInsert'=>[ 
      'date_start'=>new MongoDate(), 
     ], 
     '$inc'=>[ 
      'bytes_send'=>new MongoInt64($data->bytes_send), 
     ] 
    ],[ 
     'upsert'=>true, 
     'w'=>1, 
    ] 
); 

$setOnInsert運營商將只設置值,如果「更新插入」目前還只是一個「插入」。運行此腳本的第一次(在一個新的集合)表示:

{ 
    "_id" : NumberLong(5), 
    "bytes_send" : NumberLong(7234), 
    "date_end" : ISODate("2014-01-10T10:11:16.507Z"), 
    "date_start" : ISODate("2014-01-10T10:11:16.507Z"), 
    "disconnected" : true, 
    "download_id" : NumberLong(88), 
    "ip" : 76123123 
} 

並運行它第二次:

{ 
    "_id" : NumberLong(5), 
    "bytes_send" : NumberLong(14468), 
    "date_end" : ISODate("2014-01-10T10:11:31.184Z"), 
    "date_start" : ISODate("2014-01-10T10:11:16.507Z"), 
    "disconnected" : true, 
    "download_id" : NumberLong(88), 
    "ip" : 76123123 
} 

參見:http://docs.mongodb.org/manual/reference/operator/update/setOnInsert/

+0

謝謝!這是我需要的 – Hett