Я пытаюсь обновить / сохранить коллекцию 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 ().