Обновление Mongo при исключении определенных полей

Звучит так, будто это похоже на набор Mongo $. В этом случае я хотел бы обновить документ (обновить и/или удалить поля), но проигнорировать поле CreatorName, оставив его прежним.

Пример документа:

{id: 1, firstName: 'Testy', middleName: 'Jim', lastName: 'Shorts', creatorName: 'User1'}

Обновлено до:

{id: 1, firstName: 'Production', lastName: 'Pants', creatorName: 'User1'}

Если я использую набор, имя создателя остается прежним (хорошо), а имя и фамилия обновляются (хорошо), но среднее имя не удаляется (плохо). Установите ограничения на возможность удаления поля во время обновления.

Можно ли это сделать в запросе? Без $unset?


person Chandrew    schedule 20.08.2014    source источник
comment
Конечно, вы можете использовать $set и $unset в одном запросе - stackoverflow.com/questions/17760741/   -  person Lix    schedule 20.08.2014
comment
Полезно знать, за исключением некоторых случаев, я бы не знал, какие поля нужно отменить. Все, что я хотел бы знать, это то, как выглядит новый документ, и мне нужно игнорировать определенные поля. Можно просмотреть предыдущий документ и сравнить, но это требует производительности.   -  person Chandrew    schedule 20.08.2014
comment
Да. Похоже, вы пытаетесь выполнить довольно сложную операцию, которую монго не поддерживает напрямую.   -  person Lix    schedule 20.08.2014


Ответы (1)


Похоже, что могут происходить более сложные вещи, но вы только намекнули на это в комментариях, так что я не могу говорить об этом. Однако есть хороший способ сделать то, что вы хотите, с ситуацией с именем. Сохраните поля имени как встроенный объект и обновите объект:

> db.characters.findOne()
{
    "_id" : ObjectId("53f6293de062d5cdbec6553e"),
    "creatorName" : "Stan Smalls",
    "name" : {
        "first" : "Jack",
        "middle" : "B",
        "last" : "Quick"
    }
}
> db.characters.update({ "_id" : ObjectId("53f6293de062d5cdbec6553e") },
    { "$set" : {
        "name" : {
            "first" : "Sam",
            "last" : "Slow"
            }
        }
    }) 
> db.characters.findOne()
{
    "_id" : ObjectId("53f6293de062d5cdbec6553e"),
    "creatorName" : "Stan Smalls",
    "name" : {
        "first" : "Sam",
        "last" : "Slow"
    }
}

Более общий принцип, который вы можете применить к более сложному случаю, состоит в том, чтобы сгруппировать вместе поля, которые необходимо обновить, с теми, которые необходимо удалить всякий раз, когда связанные поля обновляются внутри встроенного документа, чтобы вы могли повторно $set документ и эффективно обновлять некоторые поля, удаляя по умолчанию одни поля и сохраняя другие.

person wdberkeley    schedule 21.08.2014
comment
Эй, это действительно хороший ответ на эту проблему и умный способ справиться с ней. К сожалению, я не могу реализовать это в данный момент, потому что у меня уже так много документов, а другие части кода зависят от моего текущего формата. Переписывание заняло бы слишком много времени. Было бы определенно полезно, если бы я мог спроектировать с нуля. - person Chandrew; 22.08.2014