Ошибка обновления / обновления MongoDB: «В документе должен существовать путь для применения обновлений массива» - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь обновить / сохранить коллекцию Mon go, основанную на элементах документов и элементах некоторых массивов в документе, и у меня возникли проблемы. Я прочитал документацию MongoDB по positional-all (выглядит как: $[]) и позиционно-отфильтровано (выглядит как: $[element]), и я также прочитал, казалось бы, похожие вопросы и ответы здесь, на Stackoverflow, но я до сих пор не могу понять это.

Пример из MongoDB

Рабочий пример того, что MongoDB документирует дает :

db.collection.update(
   { myArray: [ 0, 1 ] },
   { $set: { "myArray.$[element]": 2 } },
   { arrayFilters: [ { element: 0 } ],
     upsert: true }
)

Я пытаюсь понять, что если myArray вместо: [0,1] - это массив объектов типа [{"num": 1, "name": "X"}, {"num": 2, "name": "Y"}]

Пример моей коллекции:

var myCollection = 
[
  { "name": "Design", "price": 499,  "users": [{"username": "A", "profiles": 0} ,{"username": "B", "profiles": 2}, {"username": "C", "profiles": 9}  ], "face_to_face": 2 },
  { "name": "Launch", "price": 999,  "users": [{"username": "A", "profiles": 0} ,{"username": "R", "profiles": 6}, {"username": "X", "profiles": 10}  ], "face_to_face": 4 },
  { "name": "Scale",  "price": 1499, "users": [{"username": "B", "profiles": 0} ,{"username": "F", "profiles": 5}, {"username": "G", "profiles": 12}  ], "face_to_face": 8 }
]

Что я пытаюсь сделать в Engli sh:

Искать документы которые соответствуют «имени» и, если в этих документах есть элемент «пользователи» с заданным значением «имя пользователя», то обновите его с заданным значением «профили», но если нет элемента с этим значением "username", затем pu sh новый элемент (с заданными значениями для "username" и "profile") в массив "пользователи". Если нет документа, соответствующего «имени», то создайте этот документ (включая имя, цену и пользователей массива, у которых в начале должна быть одна запись с заданными значениями имени пользователя и профилей.

Вот код, который я пытаюсь использовать для реализации обновления / upsert:

const updateObj = {
"$set": {
"name":areaName
, "price": areaPrice
, "face_to_face": 0
,"users.$[element].username" : thisUserName 
,"users.$[element].profiles" : countProfiles
}

myCollection.updateMany({
       "name": areaName
       ,"users": {"$elemMatch": {"username": thisUserName}}
    }, updateObj, {
       arrayFilters: { "element.username": thisUserName  }],
       upsert: true
    }).exec();

Но это не работает и выдает следующую ошибку:

The path 'users' must exist in the document in order to apply array updates.

Я подозревал это потому, что в моем запросе не указано, что "users" - это массив.

Я также пробовал это:

myCollection.updateMany({
       "name": areaName
       ,"users": [{"username": thisUserName}]
    }, updateObj, {
       arrayFilters: [ { "element.username": thisUserName  }],
       upsert: true
    }).exec();

Но проблема (я думаю) в том, что это неправильно запрос документов, поскольку «пользователи» - это массив с несколькими ключами (имя пользователя, профили) вместо одного ключа (имя пользователя), указанного в запросе здесь.

Я также попробовал это:

myCollection.updateMany({
   "name": areaName
   ,"users": []
}, updateObj, {
   arrayFilters: [ { "element.username": thisUserName  }],
   upsert: true
}).exec();

Но «upsert» часть этого не работает. Она создает документ, но массив пользователей просто пуст [] вместо [{"username": thisUserName, "profiles": countProfiles ].

Help?

PS Извините Я не могу вставить песочницу mon go DB или около того что-то, не могу найти тот, который позволяет .update ().

...