2014-10-03 3 views
1

Справочная информацияВ Eve, в чем разница между вставкой документа в коллекцию с использованием метода POST http и использованием оболочки mongo?

Ответ на мой предыдущий вопрос (In Eve, how can you make a sub-resource of a collection and keep the parent collections endpoint?) было использовать несколько конечных точек, один источник данных особенность Евы. В канале IRC, я говорил с cuibonobo, и она была в состоянии получить эту работу, изменяя game_id быть ObjectID вместо строки, как показано здесь:

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

Я, однако, не сделал получить эту работу, и, как вы можете видеть из разговора, я укладывал документы в коллекции по-разному:

14:59 < cuibonobo> нет. это просто, что, так как ваш предыдущий файл настроек, сохраненных в игру идентификатор в виде строки, то поиск не будет работать

15:00 < cuibonobo> он будет работать только на документы, в которых game_id была сохранена как ObjectId

15:01 < cuibonobo> способ, которым в настоящее время работает Eve, если вы установите тип 'objectid', он преобразует строку в Mongo ObjectId перед сохранением ее в базе данных. но это преобразование не происходит со строками

15:02 < znn> я не используя накануне для хранения объектов

15:02 < znn> Я использую интерфейс Монго оболочки для вставки с НДС

15:03 < cuibonobo> oh. хмм. что может усложнить ситуацию. Ева делает типы конверсий и другие вещи перед вставкой документов.

< 15:04 cuibonobo> так вставив материал непосредственно в Монго, как правило, не рекомендуется

Вопрос Что приводит меня к StackOverflow :)

В чем разница между вставкой документа в коллекцию, используя POST-метод http и используя оболочку mongo? Смогут ли пользователи в конечном итоге использовать любой способ вставки документа?

Дополнительная информация

Я просматривал http://github.com/nicolaiarocci/eve/blob/develop/eve/methods/post.py прежде чем задавать этот вопрос, но это может занять некоторое время, чтобы понять, гораздо больше, чем просто просить кого-то, кто, возможно, является более знакомы с кодом, чем я.

ответ

2

Быстрый ответ, что Ева добавляет несколько мета-полей 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. 

Использование 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.