2014-01-10 39 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