[MONGODB] 하여 MongoDB : 너무 많은 위치 (즉 '$') 요소로 발견
MONGODB하여 MongoDB : 너무 많은 위치 (즉 '$') 요소로 발견
난 그냥 몽고 2.6.1 및 이전 작업 된 오류를 반환하지 않습니다 하나의 업데이트 문으로 업그레이드. 업데이트 문은 다음과 같습니다
db.post.update( { 'answers.comments.name': 'jeff' },
{ '$set': {
'answers.$.comments.$.name': 'joe'
}},
{ multi: true }
)
오류 I get 및입니다 :
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 2,
"errmsg" : "Too many positional (i.e. '$') elements found in path 'answers.$.comments.$.createUsername'"
}
})
내가 요소를 한 수준 깊은 대신이 업데이트 할 때 (즉, 답변을. $. 대신 답변의 이름을 지정합니다. $. 의견. $. 이름), 그것을 잘 작동합니다. 나는 2.6 이하 내 몽고 인스턴스를 다운 그레이드 할 경우, 그것은 또한 잘 작동합니다.
해결법
-
==============================
1.위치 연산자 조회 한 번만 사용될 수있다. 이것은 개선을위한 오픈 티켓이, 제한 사항입니다 : https://jira.mongodb.org/browse/SERVER-831
위치 연산자 조회 한 번만 사용될 수있다. 이것은 개선을위한 오픈 티켓이, 제한 사항입니다 : https://jira.mongodb.org/browse/SERVER-831
-
==============================
2.말한 바와 같이; 하나 개 이상의 위치 요소는 현재 지원되지 않습니다. 당신은 MongoDB의의 cursor.forEach () 메소드를 업데이트 할 수 있습니다.
말한 바와 같이; 하나 개 이상의 위치 요소는 현재 지원되지 않습니다. 당신은 MongoDB의의 cursor.forEach () 메소드를 업데이트 할 수 있습니다.
db.post .find({"answers.comments.name": "jeff"}) .forEach(function(post) { if (post.answers) { post.answers.forEach(function(answer) { if (answer.comments) { answer.comments.forEach(function(comment) { if (comment.name === "jeff") { comment.name = "joe"; } }); } }); db.post.save(post); } });
-
==============================
3.당신은이 작업을 수행 할 수 있습니다, 당신은 단지 몽고 3.6이 필요 해요! 대신 데이터베이스를 재 설계, 당신은 여기에서 찾을 수 있습니다 몽고 3.6의 배열 필터 기능을 사용할 수 있습니다 :
당신은이 작업을 수행 할 수 있습니다, 당신은 단지 몽고 3.6이 필요 해요! 대신 데이터베이스를 재 설계, 당신은 여기에서 찾을 수 있습니다 몽고 3.6의 배열 필터 기능을 사용할 수 있습니다 :
https://thecodebarbarian.com/a-nodejs-perspective-on-mongodb-36-array-filters
이것의 아름다움은 변수에 배열에 모든 일치를 결합하고 나중에 변수를 참조 할 수 있다는 것입니다. 다음은 위의 링크에서 좋은 예이다 :
-
==============================
4.나는 배열 업데이트 내부 배열에 필요한만큼 성능에 미치는 영향에 대해 같은 문제에 직면했다. 그래서, MongoDB를가이를 지원하지 않습니다. 아래에 주어진 링크에서와 같이 데이터베이스를 재 설계.
나는 배열 업데이트 내부 배열에 필요한만큼 성능에 미치는 영향에 대해 같은 문제에 직면했다. 그래서, MongoDB를가이를 지원하지 않습니다. 아래에 주어진 링크에서와 같이 데이터베이스를 재 설계.
https://pythonolyk.wordpress.com/2016/01/17/mongodb-update-nested-array-using-positional-operator/
-
==============================
5.사용 arrayFilters.
사용 arrayFilters.
우리가 scenario-을 가정 해 봅시다
"access": { "projects": [{ "projectId": ObjectId(...), "milestones": [{ "milestoneId": ObjectId(...), "pulses": [{ "pulseId": ObjectId(...) }] }] }] }
이제 프로젝트 내부에 존재하는 이정표에 펄스를 추가하려면
db.users.updateOne({ "_id": ObjectId(userId) }, { "$push": { "access.projects.$[i].milestones.$[j].pulses": ObjectId(pulseId) } }, { arrayFilters: [{ "i.projectId": ObjectId(projectId) }, { "j.milestoneId": ObjectId(milestoneId) }] })
PyMongo를 들어, 사용 arrayFilters this- 같은
db.users.update_one({ "_id": ObjectId(userId) }, { "$push": { "access.projects.$[i].milestones.$[j].pulses": ObjectId(pulseId) } }, array_filters = [{ "i.projectId": ObjectId(projectId) }, { "j.milestoneId": ObjectId(milestoneId) }])
또한,
https://jira.mongodb.org/browse/SERVER-831
-
==============================
6.
db.post.update( { 'answers.comments.name': 'jeff' }, { '$set': { 'answers.$.comments.$.name': 'joe' }}, { multi: true } )
답변입니다
db.post.update( { 'answers.comments.name': 'jeff' }, { '$set': { 'answers.0.comments.1.name': 'joe' }}, { multi: true } )
from https://stackoverflow.com/questions/24046470/mongodb-too-many-positional-i-e-elements-found-in-path by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽고에서 유효성 검사 데이터에 대한 가장 좋은 방법은 무엇입니까? (0) | 2019.12.25 |
---|---|
[MONGODB] 왜 MongoDB를 사용 인덱스 교차합니까? (0) | 2019.12.25 |
[MONGODB] 조건 MongoDB를 업데이트 (0) | 2019.12.25 |
[MONGODB] 몽구스 연결 (0) | 2019.12.25 |
[MONGODB] 몽구스의 채우기가 포함 된 (0) | 2019.12.25 |