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

Chuyển đổi một số trường trong Mongo từ Chuỗi thành Mảng

Chúng tôi không thể sử dụng $ type toán tử để lọc tài liệu của chúng tôi tại đây vì loại phần tử trong mảng của chúng tôi là "chuỗi" và như đã đề cập trong tài liệu:

Nhưng may mắn thay MongoDB cũng cung cấp $ tồn tại toán tử có thể được sử dụng ở đây với chỉ mục mảng số.

Bây giờ chúng ta có thể cập nhật những tài liệu đó bằng cách nào?

Chà, từ phiên bản MongoDB <=3.2, tùy chọn duy nhất mà chúng tôi có là mapReduce () nhưng trước tiên hãy xem xét giải pháp thay thế khác trong bản phát hành sắp tới của MongoDB.

Bắt đầu từ MongoDB 3.4, chúng ta có thể $ project tài liệu của chúng tôi và sử dụng $ split toán tử để tách chuỗi của chúng ta thành một mảng các chuỗi con.

Lưu ý rằng để chỉ tách những "thẻ" có dạng chuỗi, chúng ta cần một hợp lý $ cond xử lý ition để chỉ tách các giá trị là chuỗi. Điều kiện ở đây là $ eq đánh giá thành true khi $ type của trường bằng "string" . Nhân tiện $ type đây là mới trong 3,4.

Cuối cùng, chúng tôi có thể ghi đè bộ sưu tập cũ bằng cách sử dụng mã $ out nhà điều hành giai đoạn đường ống. Nhưng chúng tôi cần chỉ định rõ ràng việc bao gồm trường khác trong $ project giai đoạn .

db.collection.aggregate(
     [
        { "$project": { 
            "tags": { 
                "$cond": [ 
                    { "$eq": [ 
                        { "$type": "$tags" }, 
                        "string"
                    ]}, 
                    { "$split": [ "$tags", " " ] }, 
                    "$tags" 
                ] 
            } 
        }},
        { "$out": "collection" }
    ]
)

Với mapReduce , chúng tôi cần sử dụng Mảng. prototype.split () để phát ra mảng các chuỗi con trong hàm bản đồ của chúng tôi . Chúng tôi cũng cần lọc tài liệu của mình bằng cách sử dụng tùy chọn "truy vấn". Từ đó, chúng ta sẽ cần lặp lại mảng "kết quả" và $ set giá trị mới cho "thẻ" sử dụng các thao tác hàng loạt bằng cách sử dụng massWrite () phương thức mới trong 3.2 hoặc Bulk () hiện không được dùng nữa nếu chúng tôi đang ở trên 2.6 hoặc 3.0 như được hiển thị tại đây.

db.collection.mapReduce(
    function() { emit(this._id, this.tags.split(" ")); }, 
    function(key, value) {}, 
    { 
        "out": { "inline": 1 }, 
        "query": { 
            "tags.0": { "$exists": false }, 
            "tags": { "$type": 2 }
        }
    }
)['results']



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB elemMatch không hoạt động như mong đợi

  2. mongodb:bật textSearch

  3. Tôi có một truy vấn mongodb và tôi muốn tìm từ đối sánh chính xác "Được chấp thuận"

  4. Sắp xếp theo trường ảo trong mongoDB (mongoose)

  5. Mongodb .net không đồng bộ đang chờ đợi