我在使用 mongo错误保存模型失败时出现问题:MongoError:未知修饰符:$ pushAll 。
我的架构中有一个数组字段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
➜ ~
请帮我梳理一下。
答案 0 :(得分:22)
Mongo 3.6.2(或3.6.x +中的任何较新版本)不再支持$pushAll
运算符。
您可以执行以下操作:
usePushEach: true
option the Schema definition。答案 1 :(得分:14)
使用以下代码添加上述答案,以明确实施 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’s own MongoDB implementation也不支持$ pushAll。
谢谢。
答案 2 :(得分:6)
如果有任何新用户在此mongoose 5xx发现错误,则会删除对架构定义中usePushEach: true
选项的支持
您应该使用concat()
,在附加对象时通常使用push。
如果concat()
不起作用(显式或隐式调用$inc
的示例)请使用unshift()
。
答案 3 :(得分:5)
我正在使用“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'
}] });
答案 4 :(得分:1)
如果您使用> 3.6它不工作。
但是如果你能让它发挥作用,你可以使用$push
以及$each
来工作。
答案 5 :(得分:1)
用.push
替换.unshift
是解决此错误的最佳方法。
我希望这可以节省您的时间。
答案 6 :(得分:1)
用 .unshift() 替换 .push()
答案 7 :(得分:0)
尝试
Domain._doc.subDomains.push({'name': 'default' , 'role': 'xyz', ...});
这对我有用
答案 8 :(得分:0)
使用concat解决问题
var newArray= Domain.subDomains.concat([{'name': 'default' , 'role': 'xyz'}])
Domain.subDomains=newArray
Domain.save()