Ответ 1
Оператор $pushAll
больше не поддерживается в Mongo 3.6.2 (или любых более новых версиях 3.6. x+).
Вы можете сделать следующее:
- добавьте параметр
usePushEach: true
в определение схемы. - перейти на Mongo 3.4.11 (или любую версию 3.4.x)
У меня проблема при сохранении модели с ошибкой mongo: MongoError: Неизвестный модификатор: $ pushAll.
У меня есть subDomains
массива в моей схеме и которое будет сохранено по умолчанию с субдоменом, как subDomains
ниже.
// already Domain instance get availble
Domain.subDomains.push({'name': 'default' , 'role': 'xyz', ...});
// save domain with default fileds
Domain.save()
Системная информация выглядит следующим образом:
➜ ~ node --version
v9.4.0
➜ ~ npm --version
5.6.0
➜ ~
➜ ~ mongo --version
MongoDB shell version v3.6.2
git version: ......
OpenSSL version: OpenSSL 1.0.2n 7 Dec 2017
allocator: system
modules: none
build environment:
distarch: x86_64
target_arch: x86_64
➜ ~
Пожалуйста, помогите мне разобраться в этом.
Оператор $pushAll
больше не поддерживается в Mongo 3.6.2 (или любых более новых версиях 3.6. x+).
Вы можете сделать следующее:
usePushEach: true
в определение схемы.Добавляя к приведенным выше ответам следующий код, чтобы получить ясность в реализации метода concat. Вам не нужно, в частности, понижать MongoDB.
Прежде чем решить эту проблему, вам нужно иметь в виду, что метод $ pushAll устарел долгое время, поэтому, возможно, он избавится от него в версии 3.5 и выше.
Но вы можете решить эту проблему с помощью другого альтернативного метода concat.
Мой старый код,
myArray.push(id); //breaks on DocumentDB with Mongo API because of $pushAll
был заменен,
myArray = myArray.concat([id]); //this uses $set so no problems
Даже реализация Azure собственной MongoDB не поддерживает $ pushAll.
Спасибо.
В случае, если кто-то новый наткнется на это, из mongoose 5xx, поддержка usePushEach: true
опция в определении схемы была удалена
Вместо этого вы должны использовать concat()
где вы обычно используете push при добавлении объектов. В случаях, когда concat()
не работает (пример, где $inc
вызывается явно или неявно) используйте unshift()
.
Я использую "mongoose": "^ 4.12.1", и использование.push вызывало ту же ошибку. Использование usePushEach
работает для меня. Мы можем включить его для всех схем, подобных этому:
const mongoose = require('mongoose');
mongoose.plugin(schema => { schema.options.usePushEach = true });
const Schema = mongoose.Schema;
const SampleSchema = new Schema({
attr1: type,
attr2: type,
attr2: type,
attr4: [{
type: Schema.Types.ObjectId,
ref: 'ref_table_name'
}] });
Замена .push
на .unshift
- лучший способ справиться с этой ошибкой. Надеюсь, это может сэкономить ваш день.
Если вы используете> 3.6 Это не работает. Но если вы хотите, чтобы это работало, вы можете использовать $push
вместе с $each
это работало.
пытаться
Domain._doc.subDomains.push({'name': 'default' , 'role': 'xyz', ...});
это работает для меня
использовать concat решить проблему
var newArray= Domain.subDomains.concat([{'name': 'default' , 'role': 'xyz'}])
Domain.subDomains=newArray
Domain.save()