0

私は、MongoIDでANDおよびOR操作をネストする方法を理解しようとしています(MongoMapperで使用していたものから取得):

{
:$and=> [
    {
        :$or => [
            {"name"=> "joe"}, {"name" => "randy" }
    {
        :$or=> [
            {"something" => "else" }, {"another" => "thing" }
        ]
    }
]
}

和集合と共通部分のしくみについてはあまり詳しくありませんが、キッカーは、内の各子ANDがオプションであるか、保証されていないことです。つまり、内の各クエリANDはプログラムであり、チェックする項目が2つ、1つの項目などが存在する可能性があります。

私はこのようなことをすることを考えました:

Model.or({ :name => "...." }).union.or( :something => "...." })

ただし、これに関する唯一の問題は、ユーザー入力に基づいてクエリを作成するためのベストプラクティスがわからないことです。MongoIDモデルに接続しているユーザーのAPIポイントとして機能するsinatraベースのアプリケーションがあり、ユーザーがAPIを介してこのような(おそらくこれほど複雑ではない)クエリを構築できるようにしたいと考えています。

さまざまな理由でMongoMapperからMongoIDに移行していますが、MongoMapperでは、ネストされた演算子andor演算子などのすべてがメソッド内でサポートされているため、これらのクエリは少し簡単になりましたwhere

4

1 に答える 1

1

MongoID (より具体的には Origin::Query) は、次のように、多くの DSL 関数内で Mongo セレクター構文をサポートしていることが判明しました。

Model.where(   { "name" => { "$or" => [ "betsy", "charles" ] }   )

したがって、上記の例から収集すると、次のことができます。

Model.all_of(    [
    {
        "$or" => [
            {"name"=> "joe"}, {"name" => "randy" }
    },
    {
        "$or" => [
            {"something" => "else" }, {"another" => "thing" }
        ]
    }
]
于 2012-12-18T09:15:56.833 に答える