Я пишу общий код, который будет выполнять как добавление, так и обновление как атомарную операцию, поэтому использовал findOneAndUpdate
. Мои данные сглаживания с массивом вставляются как объект вместо массива. Ниже приведены подробности.
db.test.findOneAndUpdate({"saleId" : "7d55acf0-5bc2-11e8-b3e5-c51df4c55083"},{$set:{"price.priceTier.0.unitSold": 1,}}, {upsert:true})
db.test.find()
{ "_id" : ObjectId("5b0173fbcd90c934727269ac"), "saleId" : "7d55acf0-5bc2-11e8-b3e5-c51df4c55083", "price" : { "priceTier" : { "0" : { "unitSold" : 1 } } } }
Как я могу убедиться, что {$set:{"price.priceTier.0.unitSold": 1,}}
должен быть добавлен в виде массива, как показано ниже?
{ "_id" : ObjectId("5b0173fbcd90c934727269ac"), "saleId" : "7d55acf0-5bc2-11e8-b3e5-c51df4c55083", "price" : { "priceTier" : [{ "unitSold" : 1 } ]} }
Поскольку я пытаюсь написать общий код и использую модуль flat
npm
, чтобы сгладить мои входные данные для преобразования в запрос mongodb
, я стараюсь по возможности не изменять свой запрос. Пожалуйста помоги.
priceTier
, по крайней мере, а может быть, дажеprice
. Насколько это плохо? Суть в том, что нам сначала нужно$set
как массив, прежде чем вы снова сможете начать работать с ним как с массивом. Но я хотел бы получить больше информации о фактическом объеме проблемы, а именно о том, есть ли на самом деле несколько записей, которые должны быть в массиве, а не такие, которые имеют просто индекс 0. - person Neil Lunn   schedule 21.05.2018$set
как массив, тогда только я могу использовать запрос на основе индекса. Поэтому в качестве альтернативы я использовал второй пункт, о котором вы упомянули, чтобы перезаписать всеpriceTier
. Я использовал модульmongo-flatten
npm, чтобы сгладить мою полезную нагрузку. Это не меняет массив, поэтому я смог использоватьfindOneAndUpdate
сupsert
одним кодом. - person joy   schedule 21.05.2018