Я внедряю очень простую систему разговоров на mongodb.
Идея должна состоять в том, что когда я открываю конвой, он должен отображать отправляемые и принятые сообщения. Пока все в порядке и должно быть довольно легко, используя простой запрос, такой как этот псевдокод:
(from "my_id" AND to "friend_id") OR (from "friend_id" AND to "my_id")
это должно быть довольно простым и простым, но запрос просто выглядит таким сложным для меня с mongodb (я исхожу из mysql).
Я пробую это, но он вообще не работает и не может узнать, где ошибка.
$cursor =$collection->find ( array('$or' => array('$and' => array("from"=>"$profile", "to"=>"$loggeduser")), array('$and' => array("to"=>"$profile", "from"=>"$loggeduser")) ) )->limit(50)->sort(array('date' => -1));
это ничего не возвращает … Где ошибка?
Заранее спасибо.
Взгляните на эту страницу о том, как выполнять расширенные запросы MongoDB: http://www.mongodb.org/display/DOCS/Advanced+Queries
Вы можете использовать комбинацию операторов $and
и $in
чтобы получить то, что вам нужно. Используя оболочку mongo, ваш запрос будет выглядеть примерно так:
db.yourCollectionName.find({$and: {from: {$in: ["toUser", "loggedOnUser"]}}, {to: {$in: ["toUser", "loggedOnUser"]}}})
Я считаю, что это может также дать вам эквивалент:
db.yourCollectionName.find({$and: {$or: [{from: "toUser"}, {to: "toUser"}]}}, {$or: [{from: "loggedOnUser"}, {to: "loggedOnUser"}]}}})
Оттуда речь идет о преобразовании вышеуказанного языка / DSL, который вы используете, и сортировке по дате.
В вашем коде вам не нужен ($and => array())
обертывает каждый из объектов, которые вы пытаетесь найти. Удалите их, чтобы он выглядел так:
$cursor = $collection->find( array('$or' => array( array("from"=>"$profile", "to"=>"$loggeduser"), array("to"=>"$profile", "from"=>"$loggeduser") ) ) ) ->limit(50)->sort(array('date' => -1));