MongoDB ссылка / код для вставки / ссылка - PullRequest
1 голос
/ 04 февраля 2012

Я читал монгодоки и читал учебник.

Для тестирования я создал этот маленький скрипт с python / pymongo.

В основном, 3 дБ, по 2 коллекции в каждой, "заказы" и "продукты"

В коллекцию продуктов вставляются одни и те же продукты, и в каждую коллекцию заказов помещается один заказ, разница составляет то, как продукты «связаны» с заказами, в одном они связаны, в другом - встроены, а в последнем - ссылки. Наконец, обновляет одно значение в продукте и печатает его.

Мои вопросы: 1 - "отношения" хорошо сделаны переформулировать: это способ ссылки / вставки / ссылки?

2- Должен ли «встроенный» заказ отражать изменения в ценах на товары, отражать изменения в продукте или это должно быть выполнено сценарием?

# -*- coding: utf-8 *-*
from pymongo import *
from bson import *

import sys


def connect():
    try:
        auxcon = Connection('localhost', 27017)
        print "Connection: %s  database_names: %s" % (
            auxcon, auxcon.database_names())
        return auxcon
    except error.ConnectionFailure as cf:
        print "Conection error: %s" % cf
        sys.exit(0)

def newDB(db_name, conx):
    try:
        ldb = database.Database(conx, db_name + "_linked")
        edb = database.Database(conx, db_name + "_embedded")
        rdb = database.Database(conx, db_name + "_referenced")
        return ldb, edb, rdb
    except (error.TypeError, error.InvalidName) as err:
        print "Error: %s" % err
        sys.exit(0)

def newCollections(db_name):
    try:
        colprod = db_name.create_collection("products")
        colord = db_name.create_collection("orders")
        return colprod, colord
    except errors.CollectionInvalid as err:
        print "Collection alrready exists %s" % err
        return db_name["products"], db_name["orders"]

def insertProducts(colname):
    product = {"name": "Tablet", "price": 200, "desc": "Android tablet"}
    product2 = {"name": "Phone", "price": 100, "desc": "Samsung Phone"}
    try:
        p1 = colname.insert(product, safe=True)
        p2 = colname.insert(product2, safe=True)
        return p1, p2
    except errors.OperationFailure as err:
        print "Error inserting %s" % err
        return None, None


def updateProducts(colname):
    for product in colname.find({}):
        product["price"] = product["price"] * 110 / 100
        colname.save(product)

def printProducts(colname):
    print "DATABASE: %s COLLECTION: %s" % (
        colname.database.name, colname.name)
    for product in colname.find({}):
        print product

def findOrders(colname):
    print "DATABASE: %s COLLECTION: %s" % (
        colname.database.name, colname.name)
    for order in colname.find({}):
        for key, value in order.items():
            print "%s : %s" % (key, value)

if __name__ == "__main__":
    cx = connect()
    try:
        cx.drop_database("carritodb_linked")
        cx.drop_database("carritodb_embedded")
        cx.drop_database("carritodb_referenced")
    except errors.TypeError as err:
        print "Error %s" % err

    dbl, dbe, dbr = newDB("carritodb", cx)
    licoll = newCollections(dbl)
    emcoll = newCollections(dbe)
    recoll = newCollections(dbr)

    lp1, lp2 = insertProducts(licoll[0])
    ep1, ep2 = insertProducts(emcoll[0])
    rp1, rp2 = insertProducts(recoll[0])

    linkedOrder = {"userInfo": "Alex Martinavarro", "items_chart": [lp1, lp2]}
    linkedOrder = licoll[1].insert(linkedOrder, safe=True)

    embeddedOrder = {"userInfo": "Alex Martinavarro", "items_chart": []}
    embeddedOrder = emcoll[1].insert(embeddedOrder, safe=True)
    embeddedOrder = emcoll[1].find_one(embeddedOrder)
    for product in emcoll[0].find({}):
        embeddedOrder["items_chart"].append(product)
    emcoll[1].save(embeddedOrder)

    p1ref = dbref.DBRef(recoll[0].name, rp1)
    p2ref = dbref.DBRef(recoll[0].name, rp2)
    referencedOrder = {"userInfo": "Alex Martinavarro", "items": [p1ref, p2ref]}
    referencedOrder = recoll[1].insert(referencedOrder, safe=True)

    print "INSERTED PRODUCTS"
    printProducts(licoll[0])
    printProducts(emcoll[0])
    printProducts(recoll[0])

    print "ORDERS"
    findOrders(licoll[1])
    findOrders(emcoll[1])
    findOrders(recoll[1])

    """UPDATING"""
    updateProducts(licoll[0])
    updateProducts(emcoll[0])
    updateProducts(recoll[0])

    print "UPDATED PRODUCTS"
    printProducts(licoll[0])
    printProducts(emcoll[0])
    printProducts(recoll[0])

    print "ORDERS AFTER UPDATE"
    findOrders(licoll[1])
    findOrders(emcoll[1])
    findOrders(recoll[1])

1 Ответ

2 голосов
/ 06 февраля 2012

Я отвечаю из групп Google, так что извините, если ответ не совпадает с ответом, опубликованным выше.

"2- Если" встроенный "заказ отражает изменения в ценах на товары, отражает их."

Никогда, представьте, что пользователь размещает заказ, а затем, прежде чем он будет отправлен, вдруг узнает, что цена изменилась без видимых причин.Вы должны продублировать цену при оформлении заказа и поместить ее в список встроенных продуктов.Это то, что делают большинство (если не все) сайты электронной коммерции.

«В коллекцию товаров вставляются одни и те же товары, и в каждую коллекцию заказов помещается один заказ, разница в том, как работают товары»связанные "с заказами, в одном связаны, в другом встроены, и на последние ссылаются."

Любой из трех действителен, конечно, в зависимости от того, как выполняется встраивание.Если вы встраиваете заказанные продукты в заказы, это нормально, встраивание заказов в продукты не будет разумным решением.Поскольку я сомневаюсь, что кто-нибудь закажет достаточно продуктов, чтобы превысить предел в 16 МБ, вы должны быть в безопасности.

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...