카테고리 없음

[Mongodb] mongodb 색인.

행복을전해요 2021. 2. 17. 21:39

사실 문서 작업 방식을 모르고 조언을하는 것은 어렵습니다. 해결책 중 하나는 희소 인덱스를 사용하는 것입니다. 모든 첫 번째 및 마지막 배열 요소에 새 필드를 추가하기 만하면됩니다 shouldIndex. 그런 다음 shouldIndexdate필드 를 포함하는 희소 색인을 만듭니다 . 다음은 간단한 예입니다.

이 문서가 있다고 가정합니다.

{"Log": 
    [{'lat': 1, 'lng': 2, 'date': new Date(), shouldIndex : true}, 
        {'lat': 3, 'lng': 4, 'date': new Date()}, 
            {'lat': 5, 'lng': 6, 'date': new Date()}, 
                {'lat': 7, 'lng': 8, 'date': new Date(), shouldIndex : true}]}
                

첫 번째 요소와 마지막 요소에는 shouldIndex 필드가 포함되어 있습니다.

db.testSparseIndex.ensureIndex( { "Log.shouldIndex": 1, "Log.date":1 }, { spar
se: true } )

이 색인에는 첫 번째 및 마지막 요소에 대한 항목 만 포함되어야합니다.

또는 첫 번째 및 마지막 요소 날짜 필드를 별도의 배열에 저장할 수 있습니다.

희소 인덱스에 대한 자세한 내용은이 문서 를 참조 하십시오 .

도움이 되었기를 바랍니다.

-------------------

그래서 근본적으로 올바른 인덱싱에 대한 답변이있었습니다. 글을 쓰는 시점에서는 인덱싱에 대해 이야기하고 있는지 여부가 약간 불분명 해 보입니다. 싶은 것은 같이 거의 보인다 얻을 첫 번째마지막 배열의 요소에서 날짜를.

이를 염두에두고 몇 가지 접근 방식이 있습니다.

1 . 배열의 요소는 증가하는 날짜 값에 자연스럽게 삽입되었습니다.

따라서이 필드에 대한 모든 쓰기 방식이 일정 기간 동안 $ push 연산자 를 사용하는 경우에만 수행되고 이러한 항목을 업데이트 하지 않으면 적어도 날짜를 변경하면 항목은 다음과 같습니다. 이미 순서대로.

이것이 의미하는 것은 배열에서 첫 번째와 마지막 요소를 얻는 것입니다.

db.collection.find({ _id: id },{ Log: {$slice: 1 }});    // gets the first element
db.collection.find({ _id: id },{ Log: {$slice: -1 }});   // gets the last element

물론 이것은 두 개의 쿼리이지만 비교적 간단한 작업이며 비용이 많이 들지 않습니다.

2 . 어떤 이유로 요소가 날짜별로 자연스럽게 정렬되지 않습니다.

이 경우 또는 실제로 두 쿼리 형식으로 살 수없는 경우 집계 에서 첫 번째 값과 마지막 값을 가져올 수 있지만 $ min$ max 수정자를 사용합니다.

db.collection.aggregate([

    // You might want to match first. Just doing one _id here. (commented)
        //{"$match": { "_id": id }},
        
            //Unwind the array
                {"$unwind": "$Log" },
                
                    //
                        {"$group": { 
                                "_id": "$_id",
                                        "firstDate": {"$min": "$Log.Date" },
                                                "lastDate": {"$max": "$Log.Date" }
                                                    }}
                                                    
                                                    ])
                                                    

마지막으로, 여기에있는 사용 사례가 첫 번째와 마지막 날짜가있는 문서의 세부 정보를 가져 오는 것이라면 초기 두 쿼리 형식을 어느 정도 미러링하여이를 수행 할 수 있습니다. 사용 $ 첫째$ 마지막 :

db.collection.aggregate([

    // You might want to match first. Just doing one _id here. (commented)
        //{"$match": { "_id": id }},
        
            //Unwind the array
                {"$unwind": "$Log" },
                
                    // Sort the results on the date
                        {"$sort": { "_id._id": 1, "Log.date": 1 }},
                        
                            // Group using $first and $last
                                {"$group": { 
                                        "_id": "$_id",
                                                "firstLog": {"$first": "$Log" },
                                                        "lastLog": {"$last": "$Log" }
                                                            }}
                                                            
                                                            ])
                                                            

마일리지는 다를 수 있지만 실제로 해당 인덱스에 대한 유일한 사용이 될 경우 이러한 접근 방식은 인덱스의 필요성을 없앨 수 있습니다.



출처
https://stackoverflow.com/questions/22079832