วิธีการตรวจสอบว่าเขตข้อมูลอาร์เรย์มีค่าที่ไม่ซ้ำกันหรืออาร์เรย์อื่นใน MongoDB?


143

ตอนนี้ฉันกำลังใช้ mongodb

ฉันมีคอลเลกชันของโพสต์บล็อกและโพสต์ในบล็อกมีแท็กซึ่งเป็นอาเรย์เช่น

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

ฉันจะค้นหาสิ่งเหล่านี้ได้อย่างไร

  1. มี 'tag1'
  2. มี ['tag1', 'tag2'],
  3. มี ['tag3', 'tag4'] ใด ๆ

คำตอบ:


219

ลองใช้ดู

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

6
มีการบันทึกไว้เป็นอย่างดีในความช่วยเหลือ: mongodb.org/display/DOCS/…
Scott Hernandez

2
สำหรับ $ all หมายความว่าองค์ประกอบทั้งหมดและตามลำดับที่แสดงออกมาหรือเป็นเพียงการเรียงลำดับ?
redben

2
@ScottHernandez ฉันไม่เห็นว่าพวกเขาพูดถึงว่าเขตข้อมูลที่คุณใช้ในการค้นหาของคุณสามารถเป็นอาร์เรย์และวิธีการจัดการ "field: {$ in: array}" จะเกิดอะไรขึ้นเมื่อคุณค้นหาอาร์เรย์ภายในอาร์เรย์ ไม่ได้ระบุ
Zut

มี INDEXING ใดบ้างที่เราสามารถทำได้ใน array เพื่อหยุดการทำซ้ำ? ถ้าใช่โปรดแนะนำวิธี
Hitesh Joshi

1
@redben มันไม่เรียงลำดับเหมือนที่เขียนในเอกสาร: $ ทุก DOCS แค่อ่านส่วนของตัวอย่างแล้วคุณจะเห็น
แมทเธียสช

5

ประสบการณ์ของฉันคือ (2) วิธีแก้ปัญหาต่อไปนี้เร็วกว่า "$ all":

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

แต่พูดตามตรงฉันไม่ได้ว่าทำไม ฉันจะสนใจถ้าใครรู้


1
โดยวิธีการเพียงทดสอบในรายการคำหลักที่จัดทำดัชนี แน่นอนผลลัพธ์เดียวกันกับ $ และ $ all
isox

อาจจะเปลี่ยนไปในเวอร์ชั่นที่ใหม่กว่าในระหว่างนี้
heinob

มันเป็นสถานการณ์ สำหรับ "$ และ", mongodb สร้างการดำเนินการตรรกะ "และ" ดังนั้นหากการแสดงออกครั้งแรกเป็นเท็จการพิจารณาครั้งที่สองจะไม่ถูกนำมาพิจารณา นี่หมายถึงการประมวลผลที่น้อยลง
kubudi

แต่นั่นควรจะเกิดขึ้นกับ '$ all' ด้วยใช่ไหม!
heinob

1
$ all อาจเป็นสองการค้นหาในดัชนี $ และอาจเป็นหนึ่งการค้นหาที่มีการสแกนตามลำดับบนผลลัพธ์
Evan Carroll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.