0

私の各ユーザーが多くの「スマート検索」を保存できると仮定します。

user = {
    'username':'johncit',
    'smart_searches': [
        {'name':'last 24 hrs','terms':{'modifiedby':datetime(2012,1,1),'title':'foobar'}},
        {'name':'blabla','terms':{'title':'whatever','otherfield':500}}
            ]
        }

ここで、ジョンが「blabla」検索をヒットしたとします。条件を取得するにはどうすればよいですか?私は次のようなジョンのすべてのスマート検索を取得できます:

db.Users.find_one({
        'username':'johncit','smart_searches':{'$elemMatch':{'Name':'blabla'}}})

しかし、これは、私が本当に必要としている「blabla」検索の用語だけでなく、ドキュメント全体を返します。次に、クライアント側で正確な用語を理解する必要がありますか?それとも、これは「smart_searches」を独自のコレクションに入れる場合ですか?より良い構造はありますか?

私はあなたの考えを聞いてみたいです。

4

2 に答える 2

2

位置演算子がトリックを行います

> db.Users.find({'username':'johncit','smart_searches':{'$elemMatch':{'name':'blabla'}}},{'smart_searches.$.terms':1}).pretty()
{
    "_id" : ObjectId("5099ab303d550a068f16d5c5"),
    "smart_searches" : [
        {
            "name" : "blabla",
            "terms" : {
                "title" : "whatever",
                "otherfield" : 500
            }
        }
    ]
}

アップデート:

位置演算子を使用して用語を更新するには、次のように記述します。

db.Users.update({'username':'johncit',
                 'smart_searches':{'$elemMatch':{'name':'blabla'}}},
                  {$set:{'smart_searches.$.terms':{title:'changed',otherfield:200}}},
                  false,true)
于 2012-11-07T00:32:54.013 に答える
0

$elemMatchクエリ演算子の代わりに射影演算子を使用したい。

db.Users.find_one(
    {'username':'johncit', 'smart_searches.name':'blabla'},
    {'username': 1, 'smart_searches': {'$elemMatch': {'name':'blabla'}}})

$elemMatch一致するコンポーネントは1つだけなので、クエリオブジェクトで使用する必要はありませんname

于 2012-11-07T00:33:13.850 に答える