2015-03-06 3 views
1

записей базы данных:Монго - найти предметы, которые по крайней мере соответствуют массиву значений

{"item1": ["a", "b"], "item2":"etc"} 
{"item1": ["a", "b", "c"], "item2":"etc"} 
{"item1": ["a", "b", "c", "d", "e"], "item2":"etc"} 

Я хочу, чтобы вернуть все записи, где a, b и c находятся в массиве ITEM1. Он может иметь дополнительные значения.

Запрос {"item1": {"$in" :["a", "b", "c"]}} возвращает, если какой-либо из элементов массива найден, что не является идеальным.

Есть ли более простой способ сделать это, кроме вложенности $in заявления внутри $and блока:

{"item1": {"$and" :[ 
    {"$in" :["a"]}, 
    {"$in" :["b"]}, 
    {"$in" :["c"]}, 
]}} 

ответ

0

Вам не нужно использовать $in

for item in col.find({"$and": [{"item1": 'a', "item1": 'b', "item1": 'c'}]}): 
    print(item) 

Выход

{'_id': ObjectId('54fa181014d995a397252a1a'), 'item1': ['a', 'b', 'c']} 

Вы можете также использовать агрегатные трубопроводов и оператора $setIsSubset.

col.aggregate([{"$project": { "item1": 1, "is_subset": { "$setIsSubset": [ ['a', 'b', 'c'], "$item1" ] }}},{"$match": {"is_subset": True}}]) 

Выход

{ 
    'ok': 1.0, 
    'result': [ 
        { 
         '_id': ObjectId('54fa181014d995a397252a1a'), 
         'item1': ['a', 'b', 'c'], 
         'is_subset': True 
        } 
       ] 
} 
0

Не знаю, как это стойки вверх По скорости относительно PyMongo операций, но вы всегда можете сделать следующее ...

s = {'a', 'b', 'c'} 
[e for e in entries if set(e['item1']).issubset(s)] 
Смежные вопросы