提交 29e7bae3 编写于 作者: T Terry

将mysql数据库中的分类以及产品数据,同步到mnongodb的脚本

上级 8b457e32
<?php
/**
* FecShop file.
*
* @link http://www.fecshop.com/
* @copyright Copyright (c) 2016 FecShop Software LLC
* @license http://www.fecshop.com/license/
*/
namespace fecshop\app\console\modules\Category\controllers;
use Yii;
use yii\console\Controller;
/**
* @author Terry Zhao <2358269014@qq.com>
* @since 1.0
*/
class MysqldatatomongoController extends Controller
{
public $numPerPage = 10;
public function init()
{
Yii::$service->category->changeToMysqlStorage();
parent::init();
}
/**
* mongodb 同步过来的分类信息,根据mongodb中的上下级分类关系,初始化上下级。
*/
public function actionInitparentid($pageNum = 1)
{
Yii::$service->category->changeToMongoStorage();
$filter = [
'numPerPage' => $this->numPerPage,
'pageNum' => $pageNum,
'orderBy' => ['id' => SORT_ASC],
'asArray' => false,
];
$data = Yii::$service->category->apiColl($filter);
$coll = $data['coll'];
foreach ($coll as $category) {
//$origin_mysql_id
$origin_mysql_parent_id = $category['origin_mysql_parent_id'];
$origin_mysql_id = $category['origin_mysql_id'];
// 如果不是mongdb同步过来的数据,直接continue
if (!$origin_mysql_id) {
continue;
}
// 如果上级分类id为空,则代表是一级分类,parent_id 为0
// 如果上级分类id不为空,则通过mongodbParentId查询到数据,找到mysql表中的parentId
if ($origin_mysql_parent_id) {
$categoryParent = Yii::$service->category->findOne([
'origin_mysql_id' => $origin_mysql_parent_id
]);
if ($categoryParent && $categoryParent['_id']) {
$category->parent_id = (string)$categoryParent['_id'];
$category->updated_at = time();
$category->save();
}
} else {
$category->parent_id = '0';
$category->updated_at = time();
$category->save();
}
}
}
/**
* 同步数据
*/
public function actionSync($pageNum = 1)
{
$filter = [
'numPerPage' => $this->numPerPage,
'pageNum' => $pageNum,
'orderBy' => ['id' => SORT_ASC],
'asArray' => false,
];
$data = Yii::$service->category->coll($filter);
$coll = $data['coll'];
Yii::$service->category->changeToMongoStorage();
foreach ($coll as $category) {
$arr = [];
$mongoId = '';
foreach ($category as $k => $v) {
$arr[$k] = $v;
}
Yii::$service->category->sync($arr);
}
}
// 得到个数
public function actionSynccount()
{
$count = Yii::$service->category->collCount();
echo $count ;
}
// 得到个数
public function actionSyncpagenum()
{
$count = Yii::$service->category->collCount();
echo ceil($count / $this->numPerPage);
}
}
<?php
/**
* FecShop file.
*
* @link http://www.fecshop.com/
* @copyright Copyright (c) 2016 FecShop Software LLC
* @license http://www.fecshop.com/license/
*/
namespace fecshop\app\console\modules\Product\controllers;
use Yii;
use yii\console\Controller;
/**
* @author Terry Zhao <2358269014@qq.com>
* @since 1.0
*/
class MysqldatatomongoController extends Controller
{
public $numPerPage = 10;
public function init()
{
Yii::$service->product->changeToMysqlStorage();
parent::init();
}
/**
* 1.为什么要同步?
* 对于fecshop的产品数据,是放到mongodb中的,而库存的操作,和订单一起是有事务性的
* 因此,产品库存放到了mysql的表中,这是产品的真实库存数据
* 而对于mongodb中,也有一个库存字段,这个字段是为了在分类页面排序,以及后台进行库存排序,过滤等等(mysql无法和mongodb的表进行join操作,另外join操作对内存的开销大,因此用mongodb中的库存字段进行这些查询排序操作)
* 另外,在订单生成的时候,mongodb的库存字段是不扣除的。
* mongodb的库存只是用来一些范围查询搜索,而对于获取产品库存用于下单等操作,请使用mysql表的库存。
* 2.同步那些数据
* 2.1将mysql表 product_flat_qty 的库存数据,同步到 mongodb product_flat表的qty字段
*/
public function actionSync($pageNum = 1)
{
$filter = [
'numPerPage' => $this->numPerPage,
'pageNum' => $pageNum,
'orderBy' => ['id' => SORT_ASC],
'asArray' => false,
];
$data = Yii::$service->product->coll($filter);
$coll = $data['coll'];
// 得到分类信息
$productPrimaryKey = Yii::$service->product->getPrimaryKey();
foreach ($coll as $k=>$product) {
$product_id = $product[$productPrimaryKey];
$categoryIds = Yii::$service->product->getCategoryIdsByProductId($product_id);
$coll[$k]['category'] = is_array($categoryIds) ? $categoryIds : [];
}
// 切换mongodb storage
Yii::$service->product->changeToMongoStorage();
foreach ($coll as $product) {
$arr = [];
foreach ($product as $k => $v) {
$arr[$k] = $v;
}
Yii::$service->product->sync($arr);
}
}
// 得到个数
public function actionSynccount()
{
$count = Yii::$service->product->collCount();
echo $count ;
}
// 得到个数
public function actionSyncpagenum()
{
$count = Yii::$service->product->collCount();
echo ceil($count / $this->numPerPage);
}
}
#!/bin/sh
# 1.if you want sync Mysql product and category data to Mongodb storage, you can run this script
# 2.this script do not delete origin category and product data, It only adds data on the original basis
# 3.sync product and category data, url rewrite table data Will be overwritten
#
Cur_Dir=$(cd `dirname $0`; pwd)
# get category all count.
count=`$Cur_Dir/../../../../../yii category/mysqldatatomongo/synccount`
pagenum=`$Cur_Dir/../../../../../yii category/mysqldatatomongo/syncpagenum`
echo "There are $count categorys to process"
echo "There are $pagenum pages to process"
echo "##############ALL BEGINING###############";
for (( i=1; i<=$pagenum; i++ ))
do
$Cur_Dir/../../../../../yii category/mysqldatatomongo/sync $i
echo "Page $i done"
done
# set category parent_id by origin_mongo_id and origin_mongo_parent_id
echo "There are $count categorys to process"
echo "There are $pagenum pages to process"
echo "##############ALL BEGINING###############";
for (( i=1; i<=$pagenum; i++ ))
do
$Cur_Dir/../../../../../yii category/mysqldatatomongo/initparentid $i
echo "Page $i done"
done
# get product all count.
count=`$Cur_Dir/../../../../../yii product/mysqldatatomongo/synccount`
pagenum=`$Cur_Dir/../../../../../yii product/mysqldatatomongo/syncpagenum`
echo "There are $count products to process"
echo "There are $pagenum pages to process"
echo "##############ALL BEGINING###############";
for (( i=1; i<=$pagenum; i++ ))
do
$Cur_Dir/../../../../../yii product/mysqldatatomongo/sync $i
echo "Page $i done"
done
###### 1.Sync Section End
echo "##############ALL COMPLETE###############";
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册