MongoDB использует параметр для вложенного расположения - PullRequest
0 голосов
/ 17 октября 2018

есть небольшая новая проблема, хотя я не мог найти решение для подобных проблем, которые работали для меня.Вот моя коллекция:

{
   "_id": ObjectId("5bc712851224ceec702d9bdf"),
   "index": "123456",
   "name": "Jan",
   "surname": "Nowak",
   "grades": {
     "IABD": [
       2,
       3.5,
       4 
    ],
     "NPAD": [
       4,
       4,
       5 
    ] 
  } 
}

Теперь мне нужно добавить дополнительные оценки к определенным (функциональным параметрам) курсам.

Поэтому я попытался заняться этим на нескольких уровнях, и я бы кого-нибудь полюбилчтобы провести меня через это в соответствии с этим: Сначала я хотел преуспеть, не пройдя курс в качестве параметра:

function add_grade(index="123456", course="IABD", grade=5.5) 
{
db.students.update( {"index" : index }, { $push: { "grades" : { "IABD" : grade } } } );
}

ну ничего не произошло (оценка не была добавлена ​​в список оценок) Я хотел увидеть некоторый результат, поэтому я хотел посмотреть, сработает ли $ set, и это сработало!

function add_grade(index="123456", course="IABD", grade=5.5) 
{
db.students.update( {"index" : index }, { $set: { "grades" : { "IABD" : grade } } } );
}

, но он выбросил весь мой объект оценки (как и ожидалось).По крайней мере, я знаю, что я на правильном пути. Вопрос 1: Почему $ push не сработал так, как я ожидал

Вопрос 2: как использовать параметр курса в set / push? Просто чтобы уточнить Q2,Я не ленивый, я перепробовал много подходов, ни один из которых не помог, пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

$push работает не так, как вы ожидаете, потому что поле массива находится во встроенном документе, и для толкания необходимо использовать точечную запись , т. Е. Вместо

{ "$push": { "grades" : { "IABD" : grade } } }

вам нужно указать поле как точечная нотация

{ "$push": { "grades.IABD" : grade } } 

Чтобы использовать параметр курса в push, вы захотите создать объект обновления, который содержитточечная нотация

{ "grades.<course>" : grade }

например

var course = "IABD";
var grade = 5.5;
var update = {};
update["grades." + course] = grade;
printjson(update) // prints { "grades.IABD" : 5.5 }

Таким образом, ваша функция будет выглядеть как

function add_grade(index="123456", course="IABD", grade=5.5) {
    var update = {};
    update["grades." + course] = grade;
    db.students.update( 
        { "index" : index }, 
        { "$push": update } 
    );
}
0 голосов
/ 17 октября 2018

Вы можете попробовать ниже запрос.Это толчок 6 в IABD

db.getCollection('students').update( { "index": "123456" }, { $push: { "grades.IABD" :  6 } });
...