2015-07-02 2 views
0

У меня есть коллекция MongoDB, как указано ниже:Поиск в Монго внедренный документ с помощью PHP

var myCollection = [{ 
    "_id" : ObjectId("559158f6473f6c540f000282"), 
    "code" : [ 
     { 
      "score" : -100, 
      "rule_name" : "Account Email", 
      "header" : "Blacklist", 
      "reason" : "Blacklist Account Email" 
     } 
    ] 
}, 
{ 
    "_id" : ObjectId("5591592c473f6c540f000284"), 
    "code" : [ 
     { 
      "score" : -100, 
      "rule_name" : "Account Email", 
      "header" : "Blacklist", 
      "reason" : "Blacklist Account Email" 
     } 
    ] 
},{ 
    "_id" : ObjectId("55915931473f6c540f000286"), 
    "code" : [ 
     { 
      "score" : -100, 
      "rule_name" : "Account Email", 
      "header" : "Blacklist", 
      "reason" : "Blacklist Account Email" 
     } 
    ] 
},{ 
    "_id" : ObjectId("55915996473f6cd40b00010e"), 
    "code" : [ 
     { 
      "score" : 23, 
      "rule_name" : "Transaction Check", 
      "header" : "", 
      "reason" : " Transaction Check" 
     }, 
     { 
      "score" : -100, 
      "rule_name" : "Account Email", 
      "header" : "Blacklist", 
      "reason" : "Blacklist Account Email" 
     } 
    ] 
},{ 
    "_id" : ObjectId("55915a3d473f6c540f000288"), 
    "code" : [ 
     { 
      "score" : 23, 
      "rule_name" : "Transaction Check", 
      "header" : "", 
      "reason" : " Transaction Check" 
     }, 
     { 
      "score" : -100, 
      "rule_name" : "Account Email", 
      "header" : "Blacklist", 
      "reason" : "Blacklist Account Email" 
     } 
    ] 
},{ 
    "_id" : ObjectId("55942f1f473f6c7808000037"), 
    "code" : [ 
     { 
      "score" : 80, 
      "rule_name" : "Test Rule", 
      "header" : "", 
      "reason" : "Test Rule" 
     } 
    ] 
},{ 
    "_id" : ObjectId("55943328473f6cfc1000002a"), 
    "code" : [ 
     { 
      "score" : 80, 
      "rule_name" : "Test Rule", 
      "header" : "", 
      "reason" : "Test Rule" 
     } 
    ] 
},{ 
    "_id" : ObjectId("559433f9473f6cf012000032"), 
    "code" : [ 
     { 
      "score" : 80, 
      "rule_name" : "Test Rule", 
      "header" : "", 
      "reason" : "Test Rule" 
     } 
    ] 
}]; 

Я хочу искать по «причине» в поле «код» в вышеуказанном документе со следующими операторами: 1. РАВНО - возвращает весь код, в котором по крайней мере один совпадает с «почему» значение 2. не равно - возвращает весь код, в котором ни один не соответствует значению с поля «причина» Это, как я сделал это в JavaScript:

db.my_collection.find({ 
    "code.reason" : {"$ne" : "Blacklist Account Email"} 
}) 

Но я не удалось сделать это в PHP с помощью массива. Я также пробовал «$ elemMatch», но это не работает с «Not Equal». Я не могу использовать команду() в моем случае, и мне нужно, чтобы это было сделано с использованием массивов.

ответ

0

Я не проверял выход, но Вы должны сделать что-то вроде следующих

1) Без использования $elemMatch

$criteria = array('code.reason' => array("$ne" =>"Blacklist Account Email")));$collection->find($criteria); 

2) с использованием $elemMatch

$criteria = array(
    "code"=>array("$elemMatch"=>array(
    "reason"=> array("$ne"=>"Blacklist Account Email" 
    ))) 
); 

$collection->find($criteria); 

Редактировать Ты можешь агрегация использование как -

db.collection.aggregate({$unwind:"$code"},{$match:{"code.reason":{$ne:"Blacklist Account Email"}}}) 

и его эквивалент кода РНР (не тестировалась с PHP Монго)

$criteria = array(array("$unwind" => "$code"), array("$match" => array("code.reason" => array("$ne" => "Blacklist Account Email")))); 
$collection->aggregate($criteria); 

Кроме того, если у вас есть по крайней мере PHP5.4, вы можете использовать более простой синтаксис массива. Преобразование в PHP является то тривиальным, вы просто заменить фигурные скобки в квадратных скобках и колонах со стрелками

db.collection.aggregate(["$unwind":"$code"],["$match":["code.reason":["$ne":"Blacklist Account Email"]]]) 
+0

Спасибо Vishwas за ваше предложение, но первый без $ elemMatch терпит неудачу в случае соответствующего оператора, а вторые один (2) отлично работает с «$ elemMatch» для EQUAL, но он не работает с НЕ EQUAL Operator. –

+0

т. Е. Оба подхода не работают в случае оператора «НЕ РАВНО». –

+0

@TanujSaxena Я не понял, что вы хотите сделать? Вы хотите узнать «code.reason», которые не равны «Blacklist Account Email» или что-то еще? – Vishwas

Смежные вопросы