使用$ set和位置$运算符更新集合中数组中的文档

时间:2016-11-24 15:55:54

标签: python arrays mongodb mongodb-query pymongo

收藏:

{
    "shopping_list": [
        {
            "date": 22,
            "drinks": [1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000],
            "year": 2016,
            "month": 11
        },
        {
            "date": 23,
            "drinks": [1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000],
            "year": 2016,
            "month": 11
        }
    ],
    "password": "user",
    "date_signup": "10-11-2016",
    "name": "User",
    "email": "user@user.com"
}

我制作的代码:

data_1 = [1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000]
data_2 = [2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000]
con.update({"email": "user@user.com",
            "shopping_list.date": 23,
            "shopping_list.month": 11,
            "shopping_list.year": 2016},
           {"$set": {"shopping_list.$.drinks": data_2}})

也试过这个(没有用):

con.update({"email": "user@user.com",
            "shopping_list.date": {"$eq": 23},
            "shopping_list.month": {"$eq": 11},
            "shopping_list.year": {"$eq": 2016}},
           {"$set": {"shopping_list.$.drinks": data_2}})

使用我的代码,我使用shopping_list定位数组第二个索引中的$set。但是在我运行之后没有任何改变。我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

这是因为您得到的查询表达式错误。

使用查询表达式,标识要更新的文档的$位置更新运算符不知道该怎么做。如果需要在嵌入文档中指定多个条件,则需要使用$elemMatch运算符。

con.update_one({
    "email": "user@user.com", 
    "shopping_list": { "$elemMatch": {
        "date": 23,             
         "month": 11,             
         "year": 2016}
    }}, 
    {"$set": {"shopping_list.$.drinks": data_2}})

另请注意,update()实际上已在MongoDB 3.2,3.0中弃用。您应该使用update_one()方法