#database #mongodb #typescript #mongodb-query #push
#База данных #mongodb #машинопись #mongodb-запрос #толкать
Вопрос:
Я хочу добавить данные в элементы, но получаю ошибку. Как решить эту проблему mongodb / typescript?
Ошибка попытки 1: в области видимости для сокращенного свойства ‘elements’ не существует значения. Либо объявите его, либо укажите initializer.ts(18004)
Попытка 1
async add<T extends { id: string; parentID: string, elementNum: number, name: string, link: string}>(collectionName: string, args: T) {
const db = await this.getDB();
const collection = db.collection(collectionName);
return new Promise((resolve, reject) => {
collection.updateOne({ id: args.id }, {$push: {elements[args.elementNum]: {id: uuid(), name: args.name, link: args.link, elements: [] }}}, (err, res) => {
if (err) {
reject(err);
}
resolve(res);
});
});
}
Попытка 2
изменила следующее
collection.updateOne({ id: args.id }, {$push: {elements: {id: uuid(), name: args.name, link: args.link, elements: [] }}},
Попытка 2 приводит к добавлению Null в конце
{
"id": "1",
"name": "wk1",
"iconFile": "icon.png",
"elements": [
[
{
"id": "2",
"name": "element2",
"link": "https",
"elements": [
{
"id": "1",
"name": "element1",
"link": "https:"
}
]
}
],
[
{
"id": "3",
"name": "element3",
"link": "https://",
"elements": [
{
"id": "4",
"name": "w",
"link": "http:/"
}
]
}
],
[
{
"id": "3",
"name": "element3",
"link": "https://",
"elements": [
{
"id": "4",
"name": "w",
"link": "http://"
}
]
},
{
"id": "3",
"name": "element3",
"link": "https://",
"elements": [
{
"id": "4",
"name": "w",
"link": "http://www."
}
]
}
],
null,
]
}
Чего я хочу добиться, так это следующего
{
"id": "1",
"name": "wk1",
"iconFile": "icon.png",
"elements": [
[
{
"id": "2",
"name": "element2",
"link": "https",
"elements": [
{
"id": "1",
"name": "element1",
"link": "https:"
}
]
},
{
"id": "newid",
"name": "newname",
"link": "newlink"
"elements":[]
}
],
[
{
"id": "3",
"name": "element3",
"link": "https://",
"elements": [
.......
]
}
Ответ №1:
Демонстрация — https://mongoplayground.net/p/Dnmg3lL2891
Использовать — $[]
Оператор all positional $[] указывает, что оператор update должен изменить все элементы в указанном поле массива.
Оператор $ [] имеет следующий вид:
{ <update operator>: { "<array>.$[]" : value } }
db.collection.update({ _id: 1, "add.id": "1"},
{ $push: { "add.$[].elements": { id: "3", name: "a", link: "" } } })
Демонстрация для отправки массива вместо объекта — https://mongoplayground.net/p/dh3NSutIv4 —
db.collection.update({ _id: 1, "add.id": "1"},
{ $push: { "add.$[].elements": [{ id: "3", name: "a", link: "" }] } })
const args = {};
args.elementNum = 0;
const update = {
[`add.$[].elements.${args.elementNum}`]: {
a: 1
}
};
console.log(update);
//collection.updateOne({ id: args.id }, update); // use like this
Комментарии:
1. @javascriptnoob Я не понял вашу точку зрения, пожалуйста, проверьте демонстрацию, мы продвигаемся внутрь
add.elements
. Это то, что вам нужно, верно?2. @javascriptnoob Проверьте это mongoplayground.net/p/FKdPBY9FrFg вы можете уточнить
add.$[].elements.0
. Это то, что вы ищете?3. @javascriptnoob вы можете передать
"add.$[].elements." args.elementNum
в JS, что приведет кadd.$[].elements.0
?4.Или с помощью developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
add.$[].elements.${args.elementNum}
5. Может показать точный код, что вы пробовали?