1

背景资料

我之前的问题(在 Eve 中,如何创建集合的子资源并保留父集合端点?)的答案是使用多个端点,这是 Eve 的一个数据源功能。在 IRC 频道中,我正在与 cuibonobo 交谈,她能够通过将 game_id 更改为 objectid 而不是字符串来实现这一点,如下所示:

http://gist.github.com/uunsamp/d969116367181bb30731

然而,我没有得到这个工作,正如你从对话中看到的那样,我以不同的方式将文档放入集合中:

14:59 <cuibonobo> 没有。只是因为你之前的设置文件将游戏ID保存为字符串,所以查找不起作用

15:00 <cuibonobo> 它仅适用于将 game_id 保存为 ObjectId 的文档

15:01 <cuibonobo> Eve 当前的工作方式,如果你将类型设置为 'objectid',它会在将字符串保存到数据库之前将其转换为 Mongo ObjectId。但是字符串不会发生这种转换

15:02 <znn> 我没有使用 eve 来存储对象

15:02 <znn> 我一直在使用 mongo shell 接口插入项目

15:03 <cuibonobo> 哦。唔。这可能会使事情复杂化。Eve 在插入文档之前会进行类型转换和其他工作。

15:04 <cuibonobo> 所以一般不建议直接将东西插入 mongo

导致我进入stackoverflow的问题 :)

使用 http 方法 POST 和使用 mongo shell 将文档插入集合有什么区别?用户最终能否使用任何一种文档插入方法?

额外的信息

在问这个问题之前,我正在浏览http://github.com/nicolaiarocci/eve/blob/develop/eve/methods/post.py,但这可能需要一段时间才能理解,比仅仅询问可能更多的人要长得多比我自己熟悉代码。

4

1 回答 1

3

快速的回答是 Eve 正在添加一些元字段etag,updated以及created每个存储的文档。如果您想在本地存储文档(不通过 HTTP),您可以使用post_internal

Intended for internal post calls, this method is not rate limited,
authentication is not checked and pre-request events are not raised.
Adds one or more documents to a resource. Each document is validated
against the domain schema. If validation passes the document is inserted
and ID_FIELD, LAST_UPDATED and DATE_CREATED along with a link to the
document are returned. If validation fails, a list of validation issues
is returned.

用法示例

from run import app
from eve.methods.post import post_internal

payload = {
    "firstname": "Ray",
    "lastname": "LaMontagne",
    "role": ["contributor"]
}

with app.test_request_context():
    x = post_internal('people', payload)
    print(x)

插入的文档post_internal要经过相同的验证,并将像 API 客户端通过 HTTP 一样存储。在 0.5-dev(尚未发布)PATCH、PUT 和 DELETE 内部方法也已添加。

于 2014-10-04T06:40:31.540 回答