[MONGODB] upsert 배열 데이터를 몽고 수 있습니까?
MONGODBupsert 배열 데이터를 몽고 수 있습니까?
나는이 같은 몽고 문서가 있습니다.
{
"_id" : ObjectId("50b429ba0e27b508d854483e"),
"array" : [
{
"id" : "1",
"letter" : "a"
},
{
"id" : "2",
"letter" : "b"
}
],
"tester" : "tom"
}
나는 삽입 단일 몽고 명령을 사용하여 배열을 업데이트 할 수 싶은 물체의 존재 여부에 따라 발견 ()를 실행 삽입 () 및 업데이트 () 내에서 조건을 사용할 수 없습니다.
ID는 내가 선택로 원하는 항목입니다. 나는이와 배열을 업데이트한다면 :
{
"id" : "2",
"letter" : "c"
}
나는 $ 세트 문을 사용해야합니다
db.soup.update({
"tester":"tom",
'array.id': '2'
}, {
$set: {
'array.$.letter': 'c'
}
})
그리고 배열에 새로운 객체를 삽입 할 경우
{
"id" : "3",
"letter" : "d"
}
나는 $ 푸시 문을 사용해야합니다
db.soup.update({
"tester":"tom"
}, {
$push: {
'array': {
"id": "3",
"letter": "d"
}
}
})
나는 배열 항목에 대한 upsert의 일종이 필요합니다.
내가 프로그래밍이 일을하거나 내가 하나의 몽고 호출하여이 작업을 수행 할 수 있습니까?
해결법
-
==============================
1.나는 당신이 가능성이 응용 프로그램 코드에서이 문제를 처리해야합니다, 그래서 MongoDB를 2.2에서와 같은 포함 된 배열로 upsert 것이다 옵션의 인식 아니에요.
나는 당신이 가능성이 응용 프로그램 코드에서이 문제를 처리해야합니다, 그래서 MongoDB를 2.2에서와 같은 포함 된 배열로 upsert 것이다 옵션의 인식 아니에요.
가상 모음의 종류로 포함 된 배열을 처리 할 점을 감안, 대신 별도의 컬렉션으로 배열을 모델링하는 것이 좋습니다.
당신은 내장 된 배열 내에서 필드 값을 기반으로 upsert을 할 수는 없지만 이미 존재하지 않는 경우 포함 된 문서를 삽입 $ addToSet을 사용할 수 있습니다 :
db.soup.update({ "tester":"tom" }, { $addToSet: { 'array': { "id": "3", "letter": "d" } } })
즉, 배열 요소의 id로 일치의 정확한 사용 사례에 적합하지 않지만, 당신이 예상되는 현재의 값을 알고있는 경우에 유용 할 수 있습니다.
-
==============================
2.난 그냥이 문제를 자신에 달렸다. 나는 한 통화 솔루션을 찾을 수 없습니다,하지만 난 당신이 당신의 배열 요소에 고유 한 값을 가질 때 작동하는 두 개의 통화 솔루션을 발견했다. 배열의 요소를 제거 먼저 $ 풀 명령하고 푸시 $를 사용한다.
난 그냥이 문제를 자신에 달렸다. 나는 한 통화 솔루션을 찾을 수 없습니다,하지만 난 당신이 당신의 배열 요소에 고유 한 값을 가질 때 작동하는 두 개의 통화 솔루션을 발견했다. 배열의 요소를 제거 먼저 $ 풀 명령하고 푸시 $를 사용한다.
db.soup.update({ "tester":"tom" }, { $pull: { 'array': { "id": "3" } } }) db.soup.update({ "tester":"tom" }, { $push: { 'array': { "id": "3", "letter": "d" } } })
문서가 존재하지만 배열의 항목이 존재하지 않으며, 항목이 존재하는 경우 때 문서가 존재하지 않는 경우에 작동합니다.
당신이 뭔가가 있다면 다시 말하지만, 이것은 단지 배열의 요소에서 고유해야이 예에서 ID 필드처럼 작동합니다.
-
==============================
3.사용 대신 배열의 객체에이 문서를 재구성 할 수 있다면 당신은 어떤 경우에 포함 된 문서 세트의 upserts를 얻을 수 있습니다. 난 그냥 다른 질문에 대답하지만 편의를 위해 여기에 적응합니다.
사용 대신 배열의 객체에이 문서를 재구성 할 수 있다면 당신은 어떤 경우에 포함 된 문서 세트의 upserts를 얻을 수 있습니다. 난 그냥 다른 질문에 대답하지만 편의를 위해 여기에 적응합니다.
예 문서는 것
{ tester: 'tom', items: { '1': 'a', '2': 'b' } }
ID 3과 가치 'C'와 항목을 upsert, 당신은 할 것
db.coll.update( { tester: 'tom' }, { $set: { 'items.3': 'c' } } )
한 가지 단점은 필드 이름을 쿼리합니다 ($를 사용하여 쿼리 연산자를 존재) 스캔을 필요로한다는 것이다. 당신은 여분의 배열 필드 즉, 저장 속성 이름을 추가하여이 주위를 얻을 수 있습니다. 이 필드는 색인이 정상적으로 조회 할 수 있습니다. 될 Upserts
db.coll.update( { tester: 'tom' }, { $set: { 'items.3': 'c' }, $addToSet: { itemNames: 3 } } )
속성을 제거 어레이에서뿐만 아니라 그것을 끌어가 (마음 $ addToSet에 보관하는 것은 O (n은)입니다.).
db.widgets.update( { tester: 'tom' }, { $unset: { 'items.3': true }, $pull: { itemNames: 3 } } )
-
==============================
4.이봐, 당신은 배열 필터 옵션을 사용하여 수행 할 수 있습니다. 당신은 여기에서 참조 할 수 있습니다 https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-arrayfilters.
이봐, 당신은 배열 필터 옵션을 사용하여 수행 할 수 있습니다. 당신은 여기에서 참조 할 수 있습니다 https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-arrayfilters.
db.getCollection('soup').update({'tester':tom}, { $set: { "collection.$[element].letter" : 'c' } }, { arrayFilters: [ { "element.id": 2 } ] })
from https://stackoverflow.com/questions/13588342/can-mongo-upsert-array-data by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽고 컬렉션에서 특수 문자 작업 (0) | 2019.12.06 |
---|---|
[MONGODB] 어떻게 몽구스의 DB 문서에 _id 설정하는 방법? (0) | 2019.12.06 |
[MONGODB] 가치 MongoDB의 속성 이름을 단축되어 있습니까? (0) | 2019.12.05 |
[MONGODB] MongoDB의 통합 프레임 워크를 사용하여 소수점 이하 2 자리까지 반올림 (0) | 2019.12.05 |
[MONGODB] 어떻게 MongoDB의 문서에서 이중으로 중첩 된 배열에서 요소를 제거합니다. (0) | 2019.12.05 |