2

私は、mongo の非常に基本的なデータ型に対して複雑なロジック クエリを作成することと戦っています。基本的に、何百万ものユーザー属性を持つことができるので、私の基本的な mongo ドキュメントは次のとおりです。

{
   name: "Gender"
   value: "Male"
   userId : "ABC123"
}

{
   name: "M-Spike"
   value: 0.123
   userId : "ABC123"
}

私がやりたいのは、findAll userId where {name : "Gender, value: "Male"} AND { name : "m-spike", value : { $gt : 0.1} } のようなものを検索することです

集計フレームワークを使用してみましたが、クエリの複雑さは限られています。基本的に、すべての基準を論理和し、sampleId で結果をカウントしていました (基本的な AND を複製しました)。

4

1 に答える 1

0

N が照会する属性の数である場合にそれを行う方法を見ることができます (例では N は 2 です)。次のようなことを試してください:

 db.collection.aggregate(
      [  {  $match:  {$or: [ 
                        {"name":"M-Spike","value":{$gt:.1}},
                        {"name":"Gender","value":"Male"}
                           ] 
                     } 
         },   
         {  $group: { _id:"$userId",total:{$sum:1}}  
         },
         { $project: { _id:1, 
                       matchedAttr : { $eq: ["$total",2] }   
                     } 
         }
      ]
 )

あなたは戻ってきます:

{
    "result" : [
        {
            "_id" : "XYZ123",
            "matchedAttr" : false
        },
        {
            "_id" : "ABC123",
            "matchedAttr" : true
        }
    ],
    "ok" : 1
}

ここで、「$or」を介して一致した 2 つの条件がある場合、それらの両方に一致した _id に対して true が返されます。したがって、5 つの条件の場合、 $match: $or 配列には 5 つの条件ペアがあり、最後の $project 変換は次のようになります。$eq: ["$total",5]

このソリューションに組み込まれているのは、重複するエントリを持つことができないという前提です (つまり、_id に "M-Spike":.5 と "M-Spike":.2 を含めることはできません)。可能であれば、これは機能しません。

于 2012-05-21T18:37:35.807 に答える