Làm cách nào để kiểm tra xem một trường mảng có chứa một giá trị duy nhất hoặc một mảng khác trong MongoDB không?


143

Tôi đang sử dụng mongodb bây giờ.

Tôi có bộ sưu tập blogpost và blogpost có một thẻ được nộp là một mảng, ví dụ:

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

Làm thế nào tôi có thể thực hiện những tìm kiếm này

  1. chứa 'tag1'
  2. chứa ['tag1', 'tag2'],
  3. chứa bất kỳ ['tag3', 'tag4']

Câu trả lời:


219

Thử thứ này đi:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3

6
Điều này cũng được ghi lại trong phần trợ giúp: mongodb.org/display/DOCS/ Khăn
Scott Hernandez

2
với $ all, điều đó có nghĩa là tất cả các yếu tố VÀ theo thứ tự được thể hiện hay chỉ là không có thứ tự?
redben

2
@ScottHernandez Tôi không thấy rằng họ đề cập rằng lĩnh vực bạn đang sử dụng làm tìm kiếm của bạn có thể là một mảng và cách xử lý. "trường: {$ in: mảng}". Điều gì xảy ra khi bạn tìm kiếm một mảng trong một mảng các mảng? Không được chỉ định.
Zut

Có bất kỳ INDEXING nào chúng ta có thể làm trên mảng để dừng trùng lặp không? Nếu có, xin vui lòng hướng dẫn làm thế nào.
Hitesh Joshi

1
@redben không có thứ tự như được viết trong các tài liệu: $ tất cả toán tử DOCS . Chỉ cần đọc phần ví dụ và bạn sẽ thấy.
Matthias B

5

Kinh nghiệm của tôi là với (2) giải pháp sau nhanh hơn nhiều so với giải pháp có "$ all":

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

nhưng thành thật mà nói, tôi không tại sao. Tôi sẽ quan tâm, nếu có ai biết.


1
Nhân tiện, chỉ cần kiểm tra nó trên danh sách từ khóa được lập chỉ mục. Hoàn toàn giống với kết quả với $ và $ tất cả
isox

Có lẽ điều đó đã thay đổi với các phiên bản mới hơn trong khi đó.
heinob

Đó là hoàn cảnh. Đối với "$ và", mongodb thực hiện thao tác "và" logic. Do đó, nếu biểu thức thứ nhất là sai, biểu thức thứ hai không được xem xét. Điều này có nghĩa là ít xử lý.
kubudi

Nhưng điều đó cũng sẽ xảy ra với '$ all', phải không!?
heinob

1
$ all có lẽ là hai lần tra cứu trên một chỉ mục, $ và có thể là một lần tra cứu với kết quả quét tuần tự trên kết quả.
Evan Carroll
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.