MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Danh sách MongoDB - nhận mọi mục thứ N

Có vẻ như câu hỏi của bạn được hỏi rõ ràng là "lấy mọi trường hợp thứ n", đây có vẻ là một câu hỏi khá rõ ràng.

Các thao tác truy vấn như .find() thực sự chỉ có thể trả về tài liệu "nguyên trạng" ngoại trừ trường chung "lựa chọn" trong phép chiếu và các toán tử như vị trí $ toán tử đối sánh hoặc $elemMatch cho phép một phần tử mảng phù hợp số ít.

Tất nhiên là có $slice , nhưng điều đó chỉ cho phép "lựa chọn phạm vi" trên mảng, do đó, một lần nữa không áp dụng.

Những thứ "duy nhất" có thể sửa đổi kết quả trên máy chủ là .aggregate() .mapReduce() . Trước đây không "chơi tốt" với việc "cắt" mảng theo bất kỳ cách nào, ít nhất là không theo "n" phần tử. Tuy nhiên, vì các đối số "function ()" của mapReduce là logic dựa trên JavaScript, nên bạn có nhiều chỗ hơn để chơi.

Đối với các quy trình phân tích và "chỉ" cho mục đích phân tích thì chỉ cần lọc nội dung mảng qua mapReduce bằng cách sử dụng .filter() :

db.collection.mapReduce(
    function() {
        var id = this._id;
        delete this._id;

        // filter the content of "instances" to every 3rd item only
        this.instances = this.instances.filter(function(el,idx) {
            return ((idx+1) % 3) == 0;
        });
        emit(id,this);
    },
    function() {},
    { "out": { "inline": 1 } } // or output to collection as required
)

Nó thực sự chỉ là một "JavaScript runner" vào thời điểm này, nhưng nếu điều này chỉ dành cho anaylsis / testing thì không có gì sai với khái niệm này. Tất nhiên đầu ra không phải là "chính xác" cách tài liệu của bạn được cấu trúc, nhưng nó gần như một bản fax mà mapReduce có thể nhận được.

Đề xuất khác mà tôi thấy ở đây yêu cầu tạo một bộ sưu tập mới với tất cả các mục "không chuẩn hóa" và chèn "chỉ mục" từ mảng như một phần của _id unqique Chìa khóa. Điều đó có thể tạo ra một cái gì đó mà bạn có thể truy vấn trực tiếp, bu cho "mỗi mục thứ n" mà bạn vẫn phải làm:

db.resultCollection.find({
     "_id.index": { "$in": [2,5,8,11,14] } // and so on ....
})

Vì vậy, hãy tính toán và cung cấp giá trị chỉ mục của "mọi vật phẩm thứ n" để có được "mọi vật phẩm thứ n". Vì vậy, điều đó dường như không thực sự giải quyết được vấn đề đã được hỏi.

Nếu biểu mẫu đầu ra có vẻ mong muốn hơn cho mục đích "thử nghiệm" của bạn, thì một truy vấn tiếp theo tốt hơn về các kết quả đó sẽ sử dụng đường dẫn tổng hợp, với $redact

db.newCollection([
    { "$redact": {
        "$cond": {
            "if": {
                "$eq": [ 
                    { "$mod": [ { "$add": [ "$_id.index", 1] }, 3 ] },
                0 ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Điều đó ít nhất sử dụng một "điều kiện logic" giống như những gì đã được áp dụng với .filter() trước khi chỉ chọn các mục "chỉ mục thứ n" mà không liệt kê tất cả các giá trị chỉ mục có thể có dưới dạng đối số truy vấn.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Loopback - NHẬN mô hình sử dụng ID chuỗi tùy chỉnh từ MongoDB

  2. MongoDB Mối quan hệ một đến nhiều

  3. Cách khởi động lại Vùng chứa Docker MongoDB hiện có với cờ mới cho daemon

  4. Làm cách nào để chỉ định nhóm GridFS?

  5. mongoimport chọn loại trường