2013-03-08 15 views
8

Tôi muốn có thể tìm thấy nhiều tài liệu có ba hoặc nhiều giá trị khớp trong một mảng. Hãy nói rằng chúng tôi các tài liệu sau:MongoDB - So khớp nhiều giá trị trong mảng

[{ 
     name: 'John', 
     cars: [1, 2, 3, 4] 
    }, 
    { 
     name: 'Jane', 
     cars: [1, 2, 3, 8] 
    }, 
    { 
     name: 'Smith', 
     cars: [1, 8, 10] 
    }] 

Và chúng tôi muốn tìm các tài liệu có ít nhất ba trong số các giá trị (trong xe hơi) trong mảng sau:

[1, 2, 3, 4, 5, 6, 7] 

Kết quả sau đó sẽ là:

[{ 
     name: 'John', 
     cars: [1, 2, 3, 4] 
    }, 
    { 
     name: 'Jane', 
     cars: [1, 2, 3, 8] 
    }] 

Bất kỳ ai biết cách đạt được điều này?

+0

+1 Câu hỏi hay. Tôi cũng từng tự hỏi điều này trong thời gian :) –

Trả lời

7

Đây là một câu hỏi hay và tôi không nghĩ có cách đơn giản để làm điều đó với các toán tử thông thường mà MongoDB cung cấp cho bạn. Tuy nhiên tôi có thể nghĩ đến những phương pháp sau đây để đạt được điều này:

1. New Field

Tính này trong mã ứng dụng và duy trì kết quả trong một lĩnh vực mới trên tài liệu.

2. Brute Force

db.Collection.find({ $or: [ 
    { cars: $all [ 1, 2, 3 ] }, 
    { cars: $all [ 2, 3, 4 ] }, 
    ... list out all 35 combinations 
] }) 

3. Sử dụng $where

db.Collection.find({ cars: { $in: [1,2,3,4,5,6,7] }, $where: function() { 
    var numMatches = 0; 
    for (var i = 1; i <= 7; i++) 
     if (this.cars.indexOf(i) > -1) numMatches++; 
    return numMatches >= 3; 
} }); 
11

Bạn có thể có một truy vấn $in phát hành và sau đó bằng cách lọc mã kỷ lục có 3 hoặc nhiều hơn các mục trong mảng mong muốn. (Đây là một số mã python samle)

def dennisQuestion(): 
    permissibleCars = [1,2,3,4,5,6,7] 
    cursor = db.collection.find({"cars": {"$in": permissibleCars}}) 
    for record in cursor: 
     if len(set(permissible) & set(record["cars"]))) >= 3 
      yield record 
+1

đây là câu trả lời thực sự –