一个简单的数据增量更新策略(Android / MongoDB / Django)

本文介绍了如何通过JSON文件和mongoDB实现个人APP的日语汉字数据增量式更新,包括数据格式、数据库操作、版本控制、数据读取及Android端实现增量更新的详细步骤。

我在做个人APP - CayKANJI - 的时候遇到一个问题:

怎样增量式地把日语汉字数据地从服务器更新到APP端,即每次用户执行更新操作时,只获取版本高于本地缓存的内容。

 

数据格式

为了能够与mongoDB无缝结合,并省去编写后台代码的麻烦,索性就把汉字数据保存成json文件,上传到服务器后,交给web应用去读取并写入数据库。

汉字文件就是普通的json格式。

 

{
    "category": "行為ー2",
    "contents": [
        {
            "kanji" : "尋",
            "on-yomi" : "ジン",
            "kun-yomi" : "たず-ねる",
            "examples": ["不明な点を尋ねる", "行方を尋ねて回る", "由来を尋ねる", "警官が怪しい男に尋問する", "尋常ではない行動"]
        },
        {
            "kanji" : "促",
            "on-yomi" : "ソク",
            "kun-yomi" : "うなが-す",
            "examples": ["成長を促す", "発言を促す", "販売を促進する", "支払いを催促する"]
        }
    ]
}

 

数据库操作

然后利用不同的文件夹做一个队列,未被写入数据库的文件放在pending文件夹,已经写入的放在finished文件夹。这样当web服务器接收到第一次更新请求时,会检测pengding文件夹下是否有新的json文件,有的话就写入到数据库,并把json文件移动到finished文件夹。

web端用的是Django框架,使用pymongo操作数据库。

 

数据写入

def write_to_db(self, path):
    with open(path) as my_file:
        self._db.kanji.insert(json.loads(my_file.read()))
 
def check_update(self):
    for (path, dirs, files) in os.walk(self.PENDING_DIR):
        for file in files:
            self.write_to_db(os.path.join(path, file))

            # move sync-over file into 'finished' directory
            shutil.move(os.path.join(path, file), os.path.join(self.FINISHED_DIR, file))

把json数据同步到数据库后,就可以在Android端发起请求来获取数据。但是,这样做并不能在手机端实现增量更新,每次请求都会下载数据库中所有的数据。其实解决办法也很简单,给每条json数据加上一个版本就搞定了

 

增量数据的版本控制

修改之前的json文件,添加一个version字段。

{
    "category": "行為ー2",
    "version" : 0,
    "contents": [
        {
            "kanji" : "尋",
            "on-yomi" : "ジン",
            "kun-yomi" : "たず-ねる",
            "examples": ["不明な点を尋ねる", "行方を尋ねて回る", "由来を尋ねる", "警官が怪しい男に尋問する", "尋常ではない行動"]
        },
        {
            "kanji" : "促",
            "on-yomi" : "ソク",
            "kun-yomi" : "うなが-す",
            "examples": ["成長を促す", "発言を促す", "販売を促進する", "支払いを催促する"]
        }
    ]
}

 

数据读取

数据请求RESTfull风格的url - http://www.liangfeizc.com/catykanji/download/0

download后面的数字表示这次请求的最低版本号,服务器收到这个请求后会返回所有版本号大于等于0的数据。

 

首先在url.py中添加url规则

 

url(r'^download/(?P<version>\d+)$', 'download_kanji'),

 

然后在view.py中添加download_kanji函数

def download_kanji(request, version=0):
    kanji = _mongo.get_kanji(int(version))
    return HttpResponse(kanji, content_type="application/json")

 

读取大于等于version的数据

def get_kanji(self, version):
    # check pending dir to see if there's any file
    self.check_update()
    result = self._db.kanji.find({"version": {"$gte": version}})
    return json_util.dumps(result)

 

搞定了web端的增量更新规则,Android就没什么问题了。

 

Android端

Android的HTTP请求使用了AOSP的Volley库,只要把uri拼接好,添加到Volley的RequestQueue就可以了。

每次从服务器返回请求数据时,解析json文件后把最大的version的值加1后保存到Preference中,再次发送请求的时候直接从Preference中读取这个版本,拼接成一个请求指定版本号的url就可以了。

最后把解析完的json数据分成三个表保存到的数据库就大公告成了,源码可以看

https://github.com/LyndonChin

<think>好的,我现在需要帮助用户解决他们启动MongoDB时遇到的命令失败问题。用户提供的命令是: mongod --dbpath /usr/local/mongodb/data/ --config /usr/local/mongodb/mongodb.conf --logpath /usr/local/mongodb/log/mongodb.log --port 27017 首先,我需要分析这个命令可能的错误点。根据经验,用户在使用mongod命令时常见的错误包括参数顺序问题、路径权限问题、配置文件与命令行参数冲突、日志路径需要指定文件而不是目录,以及路径不存在的情况。 第一步,检查参数顺序是否正确。mongod的命令行参数顺序通常不重要,但用户可能同时使用了--config和--dbpath、--logpath等参数。如果配置文件中已经指定了这些路径,那么在命令行再次指定可能会导致冲突。这时候需要确认配置文件中的设置是否与命令行参数一致,或者是否应该去掉重复的参数。 第二步,查看路径是否存在。用户指定的路径如/usr/local/mongodb/data/、/usr/local/mongodb/log/等,可能这些目录并没有被创建。需要确保所有指定的目录都存在,否则mongod无法启动。如果不存在,用户需要手动创建这些目录,并赋予适当的权限,尤其是写权限。 第三步,检查日志路径是否正确。用户指定的--logpath参数是/usr/local/mongodb/log/mongodb.log。这里需要确认这个路径是一个文件而不是目录。如果用户指定的是一个目录,或者该路径不存在,mongod会启动失败。同时,日志文件所在的目录必须存在,否则也需要先创建。 第四步,权限问题。假设用户是在Linux或macOS下运行,mongod进程需要对这些目录有读写权限。用户可能需要使用sudo来执行命令,或者改目录的所有权和权限。例如,使用chmod修改权限,或chown改变所有者。 第五步,检查配置文件内容。如果用户使用了--config参数指定了配置文件,那么需要查看该配置文件中的参数是否与命令行参数冲突。比如,配置文件中可能已经设置了dbpath、logpath等,导致命令行参数重复指定,这时候mongod可能会报错。 第六步,查看具体的错误信息。用户可能没有提供具体的错误输出,但建议他们检查日志文件中的内容,或者直接运行命令时观察终端输出,以获取详细的错误原因。例如,如果日志路径不可写,mongod会提示权限被拒绝;如果端口被占用,会提示地址已在使用中。 第七步,验证MongoDB的安装是否完整。用户可能没有正确安装MongoDB,或者安装的版本有问题,导致mongod命令不可用。可以建议用户检查mongod的安装路径是否在系统的PATH环境变量中,或者使用绝对路径来执行命令,如/usr/local/mongodb/bin/mongod。 综合以上可能的问题,我需要逐步引导用户检查每一个环节,确保路径存在、权限正确、参数不冲突,并且配置文件内容正确。同时,建议用户分开处理,比如先不使用配置文件,仅用命令行参数启动,看是否可行,再逐步添加其他参数,以排查问题所在。</think>在启动MongoDB时指定文件路径需要注意以下关键步骤: $$mongod \ --dbpath /usr/local/mongodb/data/ \ --config /usr/local/mongodb/mongodb.conf \ --logpath /usr/local/mongodb/log/mongodb.log \ --port 27017$$ 若命令执行失败,请按照以下步骤排查: **1. 路径验证** - 确认所有目录已存在:$mkdir -p /usr/local/mongodb/{data,log}$ - 检查日志路径是文件而非目录(必须指定完整文件名) - 验证路径权限:$sudo chown -R `whoami` /usr/local/mongodb$ **2. 参数冲突处理** - 若配置文件中已包含以下参数,需删除命令行对应参数避免冲突: ```properties # mongodb.conf dbpath = /usr/local/mongodb/data/ logpath = /usr/local/mongodb/log/mongodb.log port = 27017 ``` **3. 常见错误场景** - **日志文件路径错误**:`--logpath`必须指向具体文件(如mongodb.log) - **权限不足**:添加`--fork`参数时需配合sudo使用 - **端口占用**:`lsof -i :27017`检查端口占用情况 - **数据目录锁定**:删除残留的$mongod.lock$文件 **4. 推荐启动方式** ```bash # 先确保环境就绪 sudo mkdir -p /usr/local/mongodb/{data,log} sudo touch /usr/local/mongodb/log/mongodb.log sudo chmod 777 /usr/local/mongodb/log/mongodb.log # 推荐组合命令 mongod --config /usr/local/mongodb/mongodb.conf --fork ``` **5. 日志分析** 通过$tail -f /usr/local/mongodb/log/mongodb.log$查看实时日志,重点关注以下错误模式: - `Permission denied` → 权限问题 - `Address already in use` → 端口冲突 - `IllegalOperation: Attempted to create a lock file` → 数据目录锁定 **附加建议**:生产环境建议配置systemd服务管理,可通过以下模板创建服务文件:$sudo nano /etc/systemd/system/mongodb.service$,包含以下内容: ```ini [Unit] Description=MongoDB Database Service After=network.target [Service] User=mongodb ExecStart=/usr/bin/mongod --config /usr/local/mongodb/mongodb.conf Restart=always [Install] WantedBy=multi-user.target ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值