Mongoose: mongo 였λ₯˜μ™€ ν•¨κ»˜ λͺ¨λΈ μ €μž₯ μ‹€νŒ¨: MongoError: Unknown modifier: $pushAll

에 λ§Œλ“  2017λ…„ 08μ›” 23일  Β·  27μ½”λ©˜νŠΈ  Β·  좜처: Automattic/mongoose

κΈ°λŠ₯ 을 μš”μ²­ν•˜κ±°λ‚˜ 버그λ₯Ό 보고 ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

버그 μ‹ κ³ 

ν˜„μž¬ 행동은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

둜컬 μ‹œμŠ€ν…œμ—μ„œλŠ” ν…ŒμŠ€νŠΈ ν†΅κ³Όν•˜μ§€λ§Œ μ •ν™•νžˆ λ™μΌν•œ λ²„μ „μ˜ μ  ν‚¨μŠ€ μ„œλ²„μ—μ„œλŠ” μ‹€νŒ¨ν•©λ‹ˆλ‹€. μœ μΌν•œ 차이점은 λ‚΄κ°€ 말할 μˆ˜μžˆλŠ” ν•œ λ‘œμ»¬μ€ macos이고 jenkinsλŠ” μš°λΆ„νˆ¬μž…λ‹ˆλ‹€.

MacOS Sierra, λ…Έλ“œ 8.4 및 7.11, mongodb 3.4.7 및 mongoose 4.11.7μ—μ„œ λ‹€μŒ ν…ŒμŠ€νŠΈλŠ” ν†΅κ³Όν•˜μ§€λ§Œ 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)
needs clarification

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

그게 ν•œ 가지 λ¬Έμ œμž…λ‹ˆλ‹€. mongodb 3.5λŠ” λΆˆμ•ˆμ •ν•œ 개발 λ¦΄λ¦¬μŠ€μ΄λ―€λ‘œ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. $pushAll은 μ˜€λž«λ™μ•ˆ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ―€λ‘œ μ•„λ§ˆλ„ 3.5μ—μ„œ μ œκ±°λ˜μ—ˆμ„ κ²ƒμž…λ‹ˆλ‹€. @mbroadst λͺ…ν™•νžˆ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μš°λ¦¬λŠ” μΆ”κ°€ usePushEach 이것을 ν•΄κ²°ν•˜λ €λ©΄ μ˜΅μ…˜μ„ λ‹€μ‹œ μž μ‹œ : https://github.com/Automattic/mongoose/issues/4455 ,이 문제λ₯Ό ν•΄κ²°ν•΄μ•Όν•œλ‹€ :

new Schema({ arr: [String] }, { usePushEach: true });

λͺ¨λ“  27 λŒ“κΈ€

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λŠ” λͺ¨λ“  κ²½μš°μ— 곡식 νŒ¨ν‚€μ§€μ—μ„œ μ„€μΉ˜λ©λ‹ˆλ‹€. 개발 머신은 μœˆλ„μš°μ™€ λ§₯OS, ν”„λ‘œλ•μ…˜ 머신은 μ•„λ§ˆμ‘΄ λ¦¬λˆ…μŠ€μž…λ‹ˆλ‹€.

mongo 셸을 μ‚¬μš©ν•˜μ—¬ 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μ—μ„œλŠ” ν•­λͺ©μ΄ λ°°μ—΄λ‘œ ν‘Έμ‹œλœ ν›„ λ¬Έμ„œλ₯Ό .save() μ‹œλ„ν•œ ν›„ μ‹€νŒ¨ν•©λ‹ˆλ‹€. .push() λ₯Ό 톡해 ν•­λͺ©μ„ ν‘Έμ‹œν•œ λ‹€μŒ .markModified('liked.item'); ν•„λ“œλ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€. 간단해야 ν•©λ‹ˆλ‹€.

λͺ½κ³ DB 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://github.com/Automattic/mongoose/issues/4455 ,이 문제λ₯Ό ν•΄κ²°ν•΄μ•Όν•œλ‹€ :

new Schema({ arr: [String] }, { usePushEach: true });

@vkarpov15 예 featureCompatibilityVersion=3.6 λŒ€ν•΄ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ§Œμ§€λ‹€. 이 경우 #5670을 μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚΄ μš°λΆ„νˆ¬μ—μ„œ mongodb v3.6을 μ‚¬μš©ν•˜λŠ” 것과 λ˜‘κ°™μ€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. pushAll이 dbμ—μ„œ 제거된 경우 μΈμŠ€ν„΄μŠ€λ₯Ό μ €μž₯ν•˜λŠ” 방법보닀.. λŒ€μ•ˆμ„ μ•Œλ €μ£Όμ„Έμš”.

@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 λ•Œλ¬Έμ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€. 되돌리기 μ‹œλ„:

  • λͺ½κ΅¬μŠ€λ₯Ό 버전 4.13.8( npm install [email protected] --save )둜,
  • MongoDBλ₯Ό 3.4둜( 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μ—μ„œ (λ‚΄λΆ€/ν”„λ‘œμ„ΈμŠ€/next_tick.js:131:7)
process._tickCallbackμ—μ„œ (λ‚΄λΆ€/ν”„λ‘œμ„ΈμŠ€/next_tick.js:180:9)
이름: 'λͺ½κ³  였λ₯˜',
λ©”μ‹œμ§€: 'μ•Œ 수 μ—†λŠ” μˆ˜μ •μž: $pushAll',
λ“œλΌμ΄λ²„: 사싀,
인덱슀: 0,
μ½”λ“œ: 9

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, Unknown modifier: $ pushAll 였λ₯˜ μˆ˜μ • 방법을 μ•Œλ €μ£Όμ„Έμš”.

ΠŸΡ€ΠΎΠ±ΠΎΠ²Π°Π» Π²ΠΎΡ‚ Ρ‚Π°ΠΊ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚
const mongoose = ν•„μš”('λͺ½κ΅¬μŠ€')
const Π‘Ρ…Π΅ΠΌΠ° = mongoose.Schema

const UserSchema = μƒˆ μŠ€ν‚€λ§ˆ({
ν…”λ ˆκ·Έλž¨ 아이디: {
μœ ν˜•: 번호,
ν•„μˆ˜: 사싀,
usePushEach: μ°Έ
},

μ˜ν™”: {
μœ ν˜•: [λ¬Έμžμ—΄],
κΈ°λ³Έ: []
}
})

mongoose.model('μ‚¬μš©μž', UserSchema)

@rivers-lis λ‹€μŒκ³Ό 같이 μŠ€ν‚€λ§ˆκ°€ μ•„λ‹Œ μŠ€ν‚€λ§ˆ μ˜΅μ…˜μ— usePushEach λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

new Schema({ ... }, { usePushEach: true });

카크 Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ
const λͺ½κ΅¬μŠ€ = μš”κ΅¬('λͺ½κ΅¬μŠ€')
const μŠ€ν‚€λ§ˆ = mongoose.Schema

const μ‚¬μš©μž μŠ€ν‚€λ§ˆ = μƒˆ μŠ€ν‚€λ§ˆ({
ν…”λ ˆκ·Έλž¨ 아이디: {
μœ ν˜•: 번호,
ν•„μˆ˜: 사싀
},

films: {
    type: [String],
    default: []
}

})

μƒˆ μŠ€ν‚€λ§ˆ({}, {usePushEach: true})

mongoose.model('μ‚¬μš©μž', μ‚¬μš©μž μŠ€ν‚€λ§ˆ)

new Schema({ ... }, { usePushEach: true });
이것은 버전 4.4.12 및 5.0.7μ—μ„œλ„ 였λ₯˜λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.

카크 Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ
const λͺ½κ΅¬μŠ€ = μš”κ΅¬('λͺ½κ΅¬μŠ€')
const μŠ€ν‚€λ§ˆ = mongoose.Schema

const μ‚¬μš©μž μŠ€ν‚€λ§ˆ = μƒˆ μŠ€ν‚€λ§ˆ({
ν…”λ ˆκ·Έλž¨ 아이디: {
μœ ν˜•: 번호,
ν•„μˆ˜: 사싀
},

films: {
    type: [String],
    default: []
}

})

μƒˆ μŠ€ν‚€λ§ˆ({}, {usePushEach: true})

mongoose.model('μ‚¬μš©μž', μ‚¬μš©μž μŠ€ν‚€λ§ˆ)

μ£„μ†‘ν•©λ‹ˆλ‹€ λŸ¬μ‹œμ•„μ–΄λ₯Ό 읽을 수 μ—†μŠ΅λ‹ˆλ‹€

@DanGDroidλŠ” λŒ€λž΅ "Как Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ" -> "Something like this"λ₯Ό λ²ˆμ—­ν–ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰