mongodb — поиск значения в массиве с использованием переполнения стека

У меня есть список пользователей в моей базе данных mongodb, которые затем могут следовать друг другу -претти стандарт. Используя php, я хочу проверить, следует ли конкретный пользователь другому пользователю. Мои данные выглядят так.

array (
'_id' => ObjectId("56759157e1095db549d63af1"),
'username' => 'Joe',
'following' =>
array (
0 =>
array (
'username' => 'John',
),
1 =>
array (
'username' => 'Tom',
),
),
)
array (
'_id' => ObjectId("56759132e1095de042d63af4"),
'username' => 'Tom',
'following' =>
array (
0 =>
array (
'username' => 'Joe',
),
1 =>
array (
'username' => 'John',
),
2 =>
array (
'username' => 'Sam',
),
),
)

Я хочу запрос, который проверит, следует ли Джо за Сэмом (а он нет) — так что он не даст результатов. Однако, если бы я запросил базу данных, чтобы проверить, следит ли Том за Сэмом, он выдаст результат, который покажет, что он (потому что он есть). Вы знаете, как я мог бы сделать это в PHP? Я экспериментировал с циклами Foreach, но не смог получить желаемых результатов.

0

Решение

Сделать это по запросу БД, по php потребуется больше ресурсов
Еще если хочешь по php можешь сделать так

$following=false;
foreach($data as $v) if ($v['username'] == 'Joe') {
foreach($v['following'] as $v1) if (in_array('Sam', $v1)) {
$following=true;
break 2;
}
}
echo $following;
0

Другие решения

Такие запросы лучше всего выполнять в SQL, но если вы настаиваете на решении на основе PHP, я бы предложил превратить структуру данных в элементы с ключом по имени. Как только вы обнаружите, что найти связь очень просто:

function organisePersons($data) {
$persons = array();
foreach($data as $person) {
$list = array();
foreach($person["following"] as $following) {
$list[$following["username"]] = $following["username"];
}
$person["following"] = $list;
$person["followedBy"] = array();
$persons[$person["username"]] = $person;
}
// link back to get all "followedBy":
// You can skip this block if you don't need "followedBy":
foreach ($persons as $person) {
foreach($person["following"] as $following) {
echo $person["username"] . " f. $following<br>";
if (!isset($persons[$following])) {
$persons[$following] = array(
"_id" => null, // unknown
"username" => $following,
"following" => array(),
"followedBy" => array()
);
}
$persons[$following]["followedBy"][] = $person["username"];
}
}
// return the new structure
return $persons;
}

Итак, сначала вызовите функцию выше с данными, которые у вас есть:

$persons = organisePersons($data);

И тогда вы можете написать это:

if (isset($persons["Joe"]["following"]["Sam"])) {
echo "Joe is following Sam";  // not in output
};
if (isset($persons["Tom"]["following"]["Sam"])) {
echo "Tom is following Sam";  // in output
};

Но также:

echo "Tom is following " . implode($persons["Tom"]["following"], ", ");
// Output: Tom is following Joe, John, Sam

И даже обратный вопрос: «За кем следует Том?»:

echo "Tom is followed by " . implode($persons["Tom"]["followedBy"], ", ");
// Output: Tom is followed by Joe
0

По вопросам рекламы [email protected]