União MongoDB $ ou Problemas
Pergunta
Eu tenho uma coleção que é um registro de ação entre dois usuários. Possui um src_id e um dest_id.
Estou procurando buscar todos os registros que são ações entre ID1 e uma lista de IDs - "IDS = [ID2, ID3, ID4].
As duas declarações a seguir funcionam corretamente:
act_obs = self.db.action_log.find(
{'src_id': id1, 'dest_id': {'$in': ids} }
)
act_obs = self.db.action_log.find(
{'dest_id': id1, 'src_id': {'$in': ids} }
)
No entanto, e é aqui que eu não consigo descobrir o que está errado, o seguinte se recusa a retornar quaisquer resultados:
act_obs = self.db.action_log.find(
{'$or': [
{'dest_id': id1, 'src_id': {'$in': ids} },
{'src_id': id1, 'dest_id': {'$in': ids} }
]}
)
Alguém pode esclarecer o que estou fazendo de errado, se for esse o caso? E mais importante, como realizar o que estou tentando fazer em Mongo.
Estou tentando obter todos os registros em que o ID1 é o src_id e qualquer um dos IDs na lista IDS é o dest_id ou qualquer registro em que o ID1 seja o dest_id e qualquer um dos IDs na lista IDS é o SRC_ID.
Estou usando o Pymongo 1.7. Obrigada!
Solução
O $ ou operador está disponível no MongoDB 1.5.3 e posterior.
Uma alternativa é usar uma função JavaScript, algo como ...
find = self.db.action_log.find()
find.where(pymongo.code.Code('this.dest_id==1 || this.src_id==2'))
Outras dicas
Eu não acho que você possa usar $or
Curtiu isso. Você terá que executar o lado do cliente da União.