Mongodb sắp xếp sau khi tìm thấy

Tôi có một bộ sưu tập tài liệu, trước tiên tôi cần thu hẹp bộ sưu tập này theo tiêu chí đã đặt, sau đó sắp xếp theo thứ tự bảng chữ cái theo giá trị chuỗi bên trong các tài liệu đó — giả sử đó là "kết quả tìm kiếm". Sau đó, tôi cần tìm tài liệu khớp với một

> use test
switched to db test
> db.players.insertMany([
.. {"name": "cr7", "description": "ghi ban bang hai chan va bang dau"},
.. {"name": "m10", "description": "ghi ban chan trai va chan phai"},
.. {"name": "Haaland", "description": "ghi ban chan trai"},
.. {"name": "M3p", "description": "ghi ban chan phai"},
.. {"name": "greenwood", "description": "ghi ban bang dau"}
.. ])
2 đã cho và sau đó chọn một tài liệu bên cạnh nó (trước hoặc sau) từ "kết quả tìm kiếm" ở trên

Tiểu sử

Tôi sử dụng cầy mangut để truy vấn cơ sở dữ liệu của mình qua Node. js

Tôi có một bộ "phần đặc biệt" trong blog của mình bao gồm tất cả các bài viết phải có ba điều kiện cụ thể được liên kết với các khóa trong tài liệu. Tôi có thể lấy danh sách các bài báo thuộc phần đã nói như vậy

const specialSectionListQuery = Article.find({
  tag: { $ne: "excluded" },
  [`collections.cameras`]: { $exists: true },
  status: "published",
})

Để hoàn thành việc tạo "phần đặc biệt", tôi phải sắp xếp tài liệu theo thứ tự bảng chữ cái thông qua thuộc tính

> use test
switched to db test
> db.players.insertMany([
.. {"name": "cr7", "description": "ghi ban bang hai chan va bang dau"},
.. {"name": "m10", "description": "ghi ban chan trai va chan phai"},
.. {"name": "Haaland", "description": "ghi ban chan trai"},
.. {"name": "M3p", "description": "ghi ban chan phai"},
.. {"name": "greenwood", "description": "ghi ban bang dau"}
.. ])
3 của chúng

.sort({ [`collections.cameras.as.title`]: "asc" })

Bây giờ tôi muốn thêm một liên kết đến "bài viết tiếp theo trong cùng một phần đặc biệt" ở cuối bài viết đó. Tôi biết

> use test
switched to db test
> db.players.insertMany([
.. {"name": "cr7", "description": "ghi ban bang hai chan va bang dau"},
.. {"name": "m10", "description": "ghi ban chan trai va chan phai"},
.. {"name": "Haaland", "description": "ghi ban chan trai"},
.. {"name": "M3p", "description": "ghi ban chan phai"},
.. {"name": "greenwood", "description": "ghi ban bang dau"}
.. ])
2 và bất kỳ giá trị nào khác cần thiết từ bài viết hiện tại. Truy vấn trên cung cấp cho tôi một danh sách sắp xếp các tài liệu trong phần để tôi có thể dễ dàng tìm thấy nó trong danh sách đó
> use test
switched to db test
> db.players.insertMany([
.. {"name": "cr7", "description": "ghi ban bang hai chan va bang dau"},
.. {"name": "m10", "description": "ghi ban chan trai va chan phai"},
.. {"name": "Haaland", "description": "ghi ban chan trai"},
.. {"name": "M3p", "description": "ghi ban chan phai"},
.. {"name": "greenwood", "description": "ghi ban bang dau"}
.. ])
5

Tuy nhiên, tôi cần tìm bài viết tiếp theo trong danh sách trên. Làm thế nào để làm điều đó?

nỗ lực của tôi cho đến nay

Tôi đã cố gắng tạo danh sách bài viết thông qua tính năng tổng hợp, điều này chẳng dẫn đến đâu (tôi chỉ đơn giản là làm cho ứng dụng của mình thực hiện chính xác điều tương tự — tạo danh sách cho một "giáo phái đặc biệt")

Article.aggregate([
  {
    $match: {
      tag: { $ne: "excluded" },
      [`collections.cameras`]: { $exists: true },
      status: "published",
    },
  },
  {
    $sort: {
      [`collections.cameras.as.title`]: 1,
    },
  }
]).exec()

Nhưng cả đời tôi không thể tìm ra cách lặp lại chính xác tài liệu tiếp theo trong danh sách

Tôi đã nghĩ đến việc lưu danh sách trong Node. js (biến) và sau đó tìm thứ tôi cần thông qua JavaScript nhưng không thể mở rộng được

Tôi đã xem xét việc tạo một bộ sưu tập mới và lưu danh sách trên ở đó nhưng điều đó sẽ yêu cầu tôi phải 1) làm điều đó mỗi khi tài liệu được thay đổi/thêm/xóa thông qua Nút. js — có rất nhiều mã và nó có thể bị hỏng nếu tôi tương tác với cơ sở dữ liệu theo cách khác 2) xây dựng lại bộ sưu tập mỗi khi tôi chạy truy vấn, nhưng có vẻ như nó sẽ thiếu hiệu suất

Đầu tiên chúng ta thống nhất với nhau là hiểu khái niệm Tìm kiếm toàn văn là gì? . Tìm kiếm toàn văn đơn giản chỉ là một hình thức nâng cao việc tìm kiếm dữ liệu trong cơ sở dữ liệu mà thôi

Một số người bình thường họ có thể mất nhiều bước để tìm ra một chuỗi cần thiết thì dẫn đến công việc lâu và chậm, dẫn đến chùn bước. , nếu người đó biết được khái niệm và thực thi về Fulltext search thì việc đó trở nên đơn giản hơn bao giờ hết. Và bài viết này tôi sẽ hướng dẫn về điều đó với Mongodb

Tìm kiếm toàn văn Mongodb

Đương nhiên để hiểu về Tìm kiếm toàn văn trong mongodb thì trước tiên điều kiện quyết định là bạn đã cài đặt và sử dụng mongodb rồi đấy. Nếu bạn chưa biết thì có thể đi theo những hướng dẫn trong blog này đã viết hoặc có thể vào trang chủ của mongodb

  • Cách cài đặt và tạo người dùng quản lý cơ sở dữ liệu với mongodb
  • Cách kết nối mongodb với nodejs tốt nhất

Ok, coi như xong chúng ta sẽ đi tới chỗ thực thi. Đầu tiên giả sử bạn đã làm xong xuôi mọi chuyện và bạn sẽ chèn dữ liệu vào trong DB

> use test
switched to db test
> db.players.insertMany([
.. {"name": "cr7", "description": "ghi ban bang hai chan va bang dau"},
.. {"name": "m10", "description": "ghi ban chan trai va chan phai"},
.. {"name": "Haaland", "description": "ghi ban chan trai"},
.. {"name": "M3p", "description": "ghi ban chan phai"},
.. {"name": "greenwood", "description": "ghi ban bang dau"}
.. ])

Trên đó là tôi chèn một số cầu thủ đang hot với 2 khai báo.

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
0. Tôi nói nhanh thôi, đừng đi sâu vào chi tiết

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>

OK tìm kiếm xong, như vậy là chèn thành công. Tiếp đến sử dụng Tìm kiếm toàn văn bằng cách sử dụng

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
1. Trước khi khai báo chỉ mục, nếu không, bạn sẽ bị yêu cầu lập chỉ mục văn bản cho truy vấn $text như thế này

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>

Chúng ta khai báo chỉ mục như sau để sử dụng Tìm kiếm toàn văn trong Mongodb. Code as after

________số 8

OK, xem như xong về

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
2. Chúng ta chạy lại câu lệnh trên thì sẽ tìm thấy những tài liệu chứa giá trị tìm kiếm là
> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
3

.sort({ [`collections.cameras.as.title`]: "asc" })
1

Giờ tìm kiếm ________ 44 thì chung ta cũng nhận được hết 4 văn

.sort({ [`collections.cameras.as.title`]: "asc" })
3

Bởi vì khi chúng tôi tìm kiếm nó, nó sẽ tìm kiếm toàn văn bản cho nên nhận lệnh đối sánh các từ có trong cụm từ tìm kiếm trên. ________ 45, ________ 46, ________ 47, ________ 48

Giờ chúng ta muôn đời chỉ tìm kiếm chính xác là

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
4 thôi thì chúng ta chỉ thấy
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
0 là có thể. Làm như sau

Article.aggregate([
  {
    $match: {
      tag: { $ne: "excluded" },
      [`collections.cameras`]: { $exists: true },
      status: "published",
    },
  },
  {
    $sort: {
      [`collections.cameras.as.title`]: 1,
    },
  }
]).exec()
0

Chú ý dấu

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
1 là nó phân biệt chúng ta tìm không phải là
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
2 cho nên nó tìm kiếm cụm từ một cách chính xác

Tiếp theo, chúng ta chỉ tìm thấy các yêu cầu ghi bàn bằng cách bỏ đầu. Search as after

Article.aggregate([
  {
    $match: {
      tag: { $ne: "excluded" },
      [`collections.cameras`]: { $exists: true },
      status: "published",
    },
  },
  {
    $sort: {
      [`collections.cameras.as.title`]: 1,
    },
  }
]).exec()
3

Chúng ta nhận thấy mục đích của chúng ta là sai bởi vì muốn tìm thủ thủ chỉ ghi bằng đầu thôi mà có tài liệu ghi bằng chân nữa. Chúng ta sẽ thay đổi như sau

Article.aggregate([
  {
    $match: {
      tag: { $ne: "excluded" },
      [`collections.cameras`]: { $exists: true },
      status: "published",
    },
  },
  {
    $sort: {
      [`collections.cameras.as.title`]: 1,
    },
  }
]).exec()
4

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
3 chính là giá trị tìm kiếm mà chúng tôi không muốn tìm kiếm. Này hay khải thị không?

Ngoài ra còn có một tiện ích đó là khi chúng ta tìm kiếm thì chỉ muốn đánh giá đúng nhất, chẳng hạn như elaticsearch làm được. Lúc đó bạn sẽ sử dụng

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
4

Article.aggregate([
  {
    $match: {
      tag: { $ne: "excluded" },
      [`collections.cameras`]: { $exists: true },
      status: "published",
    },
  },
  {
    $sort: {
      [`collections.cameras.as.title`]: 1,
    },
  }
]).exec()
7

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
5 sẽ có nhiệm vụ sắp xếp các cụm từ chính xác theo điểm số
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
6. Các bạn có thể nhìn lại như trên, tôi đã làm. Để ý thì thấy thứ tự lung tung cho nên chúng ta cần sắp xếp lại. Thì dùng
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
7 thôi

Tìm kiếm toàn văn MongoDB tiếng Việt

Có một câu hỏi có nhiều bạn cũng thắc mắc về cách sử dụng Text search trong MongoDB về việc search search có dấu ở VN. Thì cơ bản nó cũng giống nhau cả thôi. Chủ yếu là khi bạn chèn dữ liệu như thế nào?