2016-12-13 5 views
0

У меня есть словарь, который выглядит следующим образом:PyMongo Обновление документа с несколькими записями

{ 
    "username": "SHAURYA", 
    "stocks": [{ 
     "name": "WXYZ", 
     "count": 2, 
     "price": 100 
    }, { 
     "name": "GOOG", 
     "count": 3, 
     "price": 300 
    }, { 
     "name": "QQV", 
     "count": 5, 
     "price": 300 
    }, { 
     "name": "AAPL", 
     "count": 6, 
     "price": 300 
    }, { 
     "name": "SN", 
     "count": 4, 
     "price": 300 
    }] 
} 

Мне нужно, чтобы иметь возможность обновлять отдельные акции, а также добавлять новые акции к этому.

Если я использую команду db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}), база данных не обновляется.

Если я использую команду db.cmpe285.update({"username":username}, {"$set": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}), она заменяет все внутри запасов новой информацией.

Есть ли способ обновить существующие записи или даже добавить к нему новую запись?

ответ

0

MongoDB чувствителен к регистру. Используйте «запасы» вместо «Акции» в вашей push-операции, и вложенный документ будет правильно добавлен к массиву.

+0

Это была черта опечатка. Это также «запасы» в командах. – user2123358

1

Для новых элементов

db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}) 

Для обновления существующих элементов, если вы обновляете выделение. вам нужно использовать оператор позиционирования ($) со значением массива, указанным в запросе.

db.cmpe285.update({"username":username, "stocks.name":stock_symbol}, {"$set": {"stocks.$.count":allotment2}}) 

Для upserting пунктов, его способ 2 стадии. Сначала вам нужно запустить запрос так же, как вы это делаете, для обновления существующих элементов, как указано выше, и проверить ответ на результат ответа из вышеуказанного запроса и проверить измененный счетчик. Если измененный счетчик равен 0, нам нужно обновить, а затем вы просто сделаете это, как в случае добавления новых элементов.

db.cmpe285.update({"username":username, "stocks.name":stock_symbol}, {"$set": {"stocks.$.count":allotment2}}) 

Проверить WriteResult, если nmodified равен 0.

db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment2,"price":initial_share_price}}}) 

Если nmodified равен 1, upserting удалось.

 Смежные вопросы

  • Нет связанных вопросов^_^