7

次のようなエントリのコレクションがあります。

{
    "userid": 1, 
    "contents": [ 
            { "tag": "whatever", "value": 100 }, 
            {"tag": "whatever2", "value": 110 } 
    ] 
}

そのコレクションに対してクエリを実行し、配列の一部のみを返すことができるようにしたいと思います:クエリに一致するものです。$ 位置演算子を使用してそうしようとしていますが、これまでのところ機能していません。

より正確には、私がやりたいことは次のとおりです。

collection.find({'contents.tag':"whatever"},{'contents.$.value':1})

その結果、query に一致した配列内のエントリに対応する値 (この場合は 100) のみを持つ sth が期待されます。

何が悪いかわかりますか?$ 演算子は更新にのみ使用でき、クエリには使用できないのではないかと考えていました。知っている人はいますか?

ありがとう !

4

4 に答える 4

8

探しているのは$elemMatch演算子です。

于 2012-06-24T13:14:01.563 に答える
8

はい、その通りです。位置演算子はオブジェクトの更新に使用されます。

現時点での解決策は、配列を返し、アプリケーションでフィールドを引き出すことです。

この機能のオープンな拡張リクエストがあります (クエリで):

https://jira.mongodb.org/browse/SERVER-828

位置演算子の詳細については、次を参照してください。

http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

于 2011-06-08T15:16:33.360 に答える
0

やり過ぎかもしれませんが、これには map-reduce を使用できると思います。

最初に、クエリで事前にフィルター処理し、マップ内のすべての配列要素を発行し、発行または削減のいずれかで一致しないものをフィルター処理します。設定しないと、すべてが RAM で行われます。

この種のクエリを頻繁に実行する必要がある場合は、データを複製する価値があります。

それでも、SERVER-828 がすぐに実装されることを願っています。

于 2011-08-23T15:59:33.520 に答える
0

代わりに $in を使用してクエリを作成し、等しい値を配列に追加すると、問題を解決できます

$users_array = array(xxxxxxxx,yyyyyy);     
$user = Db::find('fb_users', array(
                            'facebook_id' => array(
                                '$in' => array($users_array)
                            )
                        ));
于 2013-07-24T16:19:07.237 に答える