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']