Матрицы (см. ?matrix
и более общие ?array
) - это векторы, связанные между собой по строкам или столбцам.
m <- matrix(0, 2, 2)
m
[,1] [,2]
[1,] 0 0
[2,] 0 0
Неудивительно, что m
является matrix
:
is.matrix(m) # you can also try is.vector(m)
[1] TRUE
Но один столбец (или строка) больше не является matrix
и в некотором роде мы «возвращаемся» к классу vector
.
is.vector(m[, 1]) # you can also try is.matrix(m[, 1])
[1] TRUE
Таким образом, класс matrix
«отбрасывается» при извлечении одной строки / столбца. Если вы хотите сохранить его, вы все равно можете:
m[, 1, drop=FALSE]
Это полезно, например. в тех случаях, когда вы хотите сохранить совместимость apply
и когда количество выделенных строк / столбцов может быть длиной 1. Например, подмножество матрицы на основе условия или чего-то еще:
# this returns an error as m[, 1] is no longer a matrix
apply(m[, 1], 1, length)
Error in apply(m[, 1], 1, length) : dim(X) must have a positive length
# but this works like a charm
apply(m[, 1, drop=FALSE], 1, length)
[1] 1 1
Наконец , есть более мелкие классы векторов, называемые атомами (см. ?vector
), и они возвращаются class
:
class(m[, 1])
[1] "numeric"
class(m[, 1]>1)
[1] "logical"
И как видно выше:
class(m[, 1, drop=FALSE])
[1] "matrix"
Предполагая, var friend = { firstName: 'Harry', lastName: 'Potter' };
Есть два варианта:
Обновление модели в памяти и сохранение (простой javascript array.push):
person.friends.push(friend);
person.save(done);
или
PersonModel.update(
{ _id: person._id },
{ $push: { friends: friend } },
done
);
Я всегда стараюсь и выбираю первый вариант, когда это возможно, потому что он будет уважать больше преимуществ, которые дает вам мангуст (крючки, проверка и т. д.), ,
Однако, если вы делаете много одновременных записей, вы столкнетесь с условиями гонки, в результате чего вы столкнетесь с неприятными ошибками версий, чтобы остановить вас от замены всей модели каждый раз и потерять предыдущего добавленного вами друга , Так что только переходите к последнему, когда это абсолютно необходимо.
Оператор $ push добавляет указанное значение в массив.
{ $push: { <field1>: <value1>, ... } }
$ push добавляет поле массива со значением как своим элементом.
Выше ответ отвечает всем требованиям, но я получил его работу, выполнив следующие
var objFriends = { fname:"fname",lname:"lname",surname:"surname" }; Friend.findOneAndUpdate( { _id: req.body.id }, { $push: { friends: objFriends } }, function (error, success) { if (error) { console.log(error); } else { console.log(success); } }); )
Я столкнулся с этим вопросом. Мое исправление заключалось в создании дочерней схемы. См. Ниже пример для ваших моделей.
---- Персональная модель
const mongoose = require('mongoose');
const SingleFriend = require('./SingleFriend');
const Schema = mongoose.Schema;
const productSchema = new Schema({
friends : [SingleFriend.schema]
});
module.exports = mongoose.model('Person', personSchema);
*** Важно: SingleFriend.schema -> обязательно используйте строчные буквы для схемы
--- Схема ребенка
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const SingleFriendSchema = new Schema({
Name: String
});
module.exports = mongoose.model('SingleFriend', SingleFriendSchema);
update
, в то время как НЕВОЗМОЖНО , чтобы найти документ, изменить его в памяти, а затем вызовите метод.save()
в документе. Когда я говорю, что операция «безопасна», это означает, что даже если один, два или 50 изменений применяются к документу, все они будут успешно применены, а поведение обновлений будет таким, как вы ожидаете. По сути, манипуляция с памятью небезопасна, потому что вы можете работать с устаревшим документом, поэтому при сохранении изменения, которые произошли после того, как шаг выборки потерян. – Will Brickner 15 November 2017 в 06:55