在Eve中,使用http方法POST和使用mongo shell将文档插入集合之间有什么区别?

时间:2014-10-03 19:52:40

标签: python eve

背景资料

我之前的问题(In Eve, how can you make a sub-resource of a collection and keep the parent collections endpoint?)的答案是使用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>我没有使用前夕存储对象

     

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,但这可能需要一段时间才能理解,这比询问可能比我更熟悉代码的人要长得多。 < / p>

1 个答案:

答案 0 :(得分:2)

快速回答是Eve正在添加一些元字段etagupdatedcreated以及每个存储的文档。如果要在本地存储文档(不通过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.

用法example

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内部方法也已添加。