을 upsert 나는 다음과 같은 일을하고 싶습니다 :지수와 내가 몽고 작업 한 몽고의 하위 문서
when a set of (lat, lon, uid) comes in:
1. the collection has lat as unique index, also for each lat the lon index is unique
2. if (lat, lon) pair exists in this collection, update uid in the sub-document
3. if (lat) exists in this document , insert (lon, uid) in the lons sub-document
4. if (lat) document doesn't exist, create lat document and do 2
[{
"lat" : 1, (doc is unique by lat)
"lons" : [
{
"lon" : 2, (the subdocument is unique by lon)
"uid" : 3
},
{
"lon" : 3,
"uid" : 3
}
]
},
{
"lat" : 2,
"lons" : [
{
"lon" : 2,
"uid" : 4
}
]
}]
나는 다음과 같은 일을하려고하지만 분명히 그것은 내가 상상 무엇으로 작동하지 않습니다.
db.zones.update({'lat': 90}, {$push: {lons: {'uid' : 0, 'lon': -18}}}, { upsert: true })
db.zones.ensureIndex({'lat': -1, 'lons.lon':1}, {unique: true})
이 게시물 Can mongo upsert array data?과 일부는 있지만 어떻게 든 작동하지는 않습니다. 내 문제인지 아니면 몽구스 문제인지 나는 모른다. 감사!
내가 전에 이것에 대해 생각하고 있었다 : 기존 문서, 당신은 또한 (대신
$set
에)$setOnInsert
연산자를 사용할 수 있습니다. 문제는 제가 약 10k 포인트의 lon과 10k lat를 갖게 될 것이므로이 방법으로 100m 문서를 만들 수 있다는 것을 의미합니다. 여전히 좋은 디자인입니까? –확실히! [대형 임베디드 어레이] (http://askasya.com/post/largeembeddedarrays)에서 언급 한 블로그 게시물을 읽어보십시오. 두 경우 모두 고유 한 위도/경도 쌍에 대해 동일한 수의 색인 항목이 있으므로 색인을 거의 동일한 크기로 간주하십시오. 그러나 각'lat' 문서에 10k'lon' 값의 배열이 포함되어 있다면, 문서가 디스크에서 공간을 초과함에 따라 추가 성능이 저하됩니다 (문서가 움직일 때마다 해당 문서의 모든 색인 항목 또한 있어야합니다). 업데이트 됨) 문서의 한 점만 가져와야하는 경우 서버는 전체 문서를 RAM에로드해야합니다. – Stennie
나는 본다. 이 방법으로 생성 된 NxN 문서는 질의 시간 O (1) 또는 O (N^2)입니까? 또한 질문에 대한 더 많은 리소스를 제안 해 주시겠습니까, 몽고에 대한 불필요한 비용? 큰 오 물건들? 대단히 감사합니다 !! –