您要请求功能还是报告错误?
报告错误
目前的行为是什么?
测试在本地机器上通过但在具有完全相同版本的 jenkins 服务器上失败。 据我所知,唯一的区别是本地是 macos,而 jenkins 是 ubuntu。
在 MacOS Sierra、节点 8.4 和 7.11、mongodb 3.4.7 和 mongoose 4.11.7 上,以下测试通过,但在我们的 jenkins 服务器上,在 ubuntu 16.04 服务器上使用完全相同的版本失败。
it("should successfully allow an alias that matches a service", async () => {
const aliasTag = "this is a test";
const appAlias = await AliasController.create(user, appAliasSpec);
const serviceAlias = await AliasController.create(user, serviceAliasSpec);
appAlias.aliases.push(aliasTag);
await appAlias.save(); // This is the line that fails in jenkins
serviceAlias.aliases.push(aliasTag);
await serviceAlias.save();
const confAppAlias = await AliasController.getById(appAlias._id);
const confServiceAlias = await AliasController.getById(serviceAlias._id);
expect(confAppAlias.aliases[1]).to.equal(aliasTag);
expect(confServiceAlias.aliases[1]).to.equal(aliasTag);
});
这是我得到的确切错误:
{
"message": "Unknown modifier: $pushAll",
"name": "MongoError",
"stack": "MongoError: Unknown modifier: $pushAll\n at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)\n at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)\n at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67\n at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18\n at _combinedTickCallback (internal/process/next_tick.js:131:7)\n at process._tickCallback (internal/process/next_tick.js:180:9)",
"code": 9
}
编辑:这是堆栈跟踪的更具可读性的版本
MongoError: Unknown modifier: $pushAll
at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
你能做mongoose.set('debug', true)
并粘贴 mongo 输出吗?
编辑:更清晰的输出
Mongoose: aliases.update({ _id: ObjectId("599d98122b72d12e0ba858b4") }, { '$pushAll': { aliases: [ 'this is a test' ] }, '$set': { updatedAt: new Date("Wed, 23 Aug 2017 14:58:26 GMT") }, '$inc': { __v: 1 } })
{"name":"davis","hostname":"ld-ub-bm980a98v","pid":11787,"level":50,"err":{"message":"Unknown modifier: $pushAll","name":"MongoError","stack":"MongoError: Unknown modifier: $pushAll
at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)","code":9},"msg":"An unhandled Mongo error occurred.","time":"2017-08-23T14:58:26.201Z","v":0}
对于它的价值,我检查了我们本地开发和生产环境中的调试输出,他们都成功地使用了 $pushAll 修饰符。 在所有情况下,Mongo 都是从官方软件包安装的。 开发机器是windows和MacOS,生产机器是amazon linux。
您可以使用 mongo shell 连接到您的 jenkins mongodb 实例并使用db.version
仔细检查版本吗?
$ mongo test
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/test
MongoDB server version: 3.4.1
> db.version()
3.4.1
> ^C
bye
您还可以使用 mongoose 使用serverStatus()
命令打印服务器版本:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
mongoose.connection.on('open', function() {
mongoose.connection.db.admin().serverStatus(function(error, info) {
console.log(info.version);
});
});
请先仔细检查您的版本,官方软件包往往很快就会过时。
是的,有同样的错误。 尝试从 3.2 移动到 3.5(无数据迁移)。 我有一个数组字段
'liked': {
'item':[ {
'id': {'type': Types.ObjectId, 'ref': 'Item'},
'score': {'type': Number, 'max': 100, 'default': -1},
'comment': {'type': String, 'maxlength': 65000, 'trim': true, 'default': '', 'set': san.methods.safe}
} ]
},
我知道, id
不是最好的字段名称,但是嘿,它在 3.2 中有效。 在 3.5 中,在将 Item 推入数组后尝试.save()
文档后失败。 我通过.push()
推送项目,然后标记字段.markModified('liked.item');
。 应该很简单。
MongoDB 3.5?
是的
targetMinOS: Windows 7/Windows Server 2008 R2
db version v3.5.13
git version: 52bbaa007cd84631d6da811d9a05b59f2dfad4f3
OpenSSL version: OpenSSL 1.0.1u-fips 22 Sep 2016
allocator: tcmalloc
modules: none
build environment:
distmod: 2008plus-ssl
distarch: x86_64
target_arch: x86_64
嗯,这是一个问题,mongodb 3.5 是一个不稳定的开发版本,不应该使用。 $pushAll 已经弃用了很长时间,所以也许他们在 3.5 中摆脱了它。 @mbroadst你能澄清一下吗?
我们添加了一个usePushEach
选项来解决这个问题: https :
new Schema({ arr: [String] }, { usePushEach: true });
@vkarpov15是的,它已以featureCompatibilityVersion=3.6
被移除
摸。 在这种情况下,我们将确保将#5670 排除在外。
我在 ubuntu 上使用 mongodb v3.6 时遇到了同样的问题。 如果从数据库中删除了 pushAll,那么我应该如何保存实例.. 请为我提供任何替代方案
@rankitbishnoi您可以通过在选项中的每个模式定义上添加usePushEach
选项来暂时解决此问题。
@vkarpov15感谢您的精彩图书馆先生。
我也遇到了 Mongoose 4.13.7 和 MongoDB 3.6.0 的这个问题。
更新:将usePushEach: true
到模型的模式选项解决了这个问题。
@dyladan @chaddjohnson确实有效。
多谢!
请问,我该怎么做? 如何将其添加到架构选项中? 谢谢你!
@raphaelbp12以下是使用架构选项的文档: http : //mongoosejs.com/docs/guide.html
更新架构不会更改此行为。 它不适用于 3.6 版本的数据库中的旧数据。
编辑:恢复到 3.4 版解决了这个问题。
我在我的机器上运行代码时遇到了类似的问题。 我认为是因为 Mongoose 5 和 MongoDB 3.6。 尝试恢复:
npm install [email protected] --save
),和db.version()
)。它对我有用! :)
Mongoose 5 不应受此问题的影响,它不会在任何地方使用$pushAll
。 如果您在使用 mongoose 5 时遇到此错误,请打开代码示例的问题:+1:
PS C:\Users\paula\projetos\apiNode\src> 节点 index.js
{ MongoError:未知修饰符:$pushAll
在 Function.MongoError.create (C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\error.js:31:11)
在 toError (C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\utils.js:139:22)
在 C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\collection.js:1059:67
在 C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\connection\pool.js:469:18
在 _combinedTickCallback (internal/process/next_tick.js:131:7)
在 process._tickCallback (internal/process/next_tick.js:180:9)
name: 'MongoError',
消息:'未知修饰符:$pushAll',
司机:是的,
指数:0,
代码:9
大家好,请告诉我如何修复错误未知修饰符:$ pushAll
Пробовал вот так не работает
const 猫鼬 = 要求('猫鼬')
const Схема = mongoose.Schema
const UserSchema = 新架构 ({
电报ID:{
类型:数字,
要求:真实,
usePushEach: 真
},
电影:{
类型:[字符串],
默认: []
}
})
mongoose.model ('users', UserSchema)
@rivers-lis 您必须将usePushEach
到架构选项中,而不是添加到架构中,如下所示:
new Schema({ ... }, { usePushEach: true });
Как то вот так
const 猫鼬 = 要求('猫鼬')
const Schema = mongoose.Schema
const UserSchema = 新架构({
电报ID:{
类型:数字,
要求:真实
},
films: {
type: [String],
default: []
}
})
新架构({},{usePushEach:true})
mongoose.model('users', UserSchema)
new Schema({ ... }, { usePushEach: true });
这也解决了我在 4.4.12 和 5.0.7 版本上的错误
Как то вот так
const 猫鼬 = 要求('猫鼬')
const Schema = mongoose.Schemaconst UserSchema = 新架构({
电报ID:{
类型:数字,
要求:真实
},films: { type: [String], default: [] }
})
新架构({},{usePushEach:true})
mongoose.model('users', UserSchema)
抱歉看不懂俄语
@DanGDroid粗略翻译了“Как то вот так”->“类似这样的东西”
最有用的评论
嗯,这是一个问题,mongodb 3.5 是一个不稳定的开发版本,不应该使用。 $pushAll 已经弃用了很长时间,所以也许他们在 3.5 中摆脱了它。 @mbroadst你能澄清一下吗?
我们添加了一个
usePushEach
选项来解决这个问题: https :