1

我的 MongoDB 数据库中的产品具有以下结构:

product_1 = {
    'name':'...',
    'logo':'...',
    'nutrition':'...',
    'brand':{
        'name':'...',
        'logo':'...'
        },
    'stores':{[
            'store_id':...,
            'url':'...',
            'prices':{[
                        'date':..., 
                        'price':...
                       ]}
             ]}
    })

我的pymongo脚本从一个商店转到另一个商店,我尝试做以下事情:

  • 如果产品不在数据库中:使用当前 store_id 的当前价格和日期添加有关产品的所有信息。
  • 如果产品在数据库中,但我没有当前 stroe 的任何条目:添加一个stores包含当前价格、日期和 store_id 的条目。
  • 如果产品在数据库中,并且我有当前商店的价格条目,但当前价格不一样:为当前 store_id 添加一个带有新日期和价格的新条目。

是否可以在一个请求中完成所有操作?现在我一直在尝试以下方法,但并不真正知道如何处理storesprices案例。
也许这不是构建我的数据库的最佳方式,我愿意接受建议。

db.find_and_modify(
                query={'$and':[
                        {'name':product['name']},
                        {'stores':{'$in':product['store_id']}}
                        ]},
                update={
                    '$setOnInsert':{
                                    'name':product['product_name'],
                                    'logo':product['product_logo'],
                                    'brand':product['brand'],
                                    [something for stores and prices ?]
                                    },
                    },
                upsert=True
                )
4

1 回答 1

1

目前(MongoDB 2.6)没有一种方法可以在一个查询中完成所有这些事情。您可以检索文档并进行更新,然后保存更新的版本(或插入新文档):

oldDoc = collection.find_one({ "name" : product["name"] })
if oldDoc:
    # examine stores + prices to create updated doc called newDoc
else:
    # make a new doc, newDoc, for the product
collection.save(newDoc) # you can use save if you put the same _id on newDoc as oldDoc

或者,我认为您的嵌套数组模式是导致这种头痛的原因,并且可能会导致更多的头痛(例如,更新特定日期和商店的特定产品的价格 - 不能通过单个数据库调用来做到这一点)。我会让每个文档代表一个嵌套数组的最低级别 - 在特定日期以特定价格在特定商店以特定价格出售的特定产品:

{
    "product_name" : "bacon mayonnaise",
    "store_id" : "123ZZZ8",
    "price" : 99,
    "date" : ISODate("2014-12-31T17:18:53.944Z")
    // other stuff
}

您可以在每个文档中复制大量通用产品信息或将其存储在单独的文档中 - 是否值得复制一些信息与再次访问数据库以调用产品详细信息取决于您将如何使用这些文档。请注意,您尝试解决的问题在这种结构中消失了——您只需对给定的产品、商店、价格和日期进行更新插入。

于 2014-12-31T17:23:30.550 回答