0

どのフィールドが一致するかに基づいて結果を並べ替えようとしています。次のようなドキュメントを含むコレクションがあるとします。

{
   "foo": "orange",
   "bar": "apple",
   "baz": "pear",
}

{
   "foo": "kiwi",
   "bar": "orange",
   "baz": "banana",
}

foo、bar、または baz のいずれかで「orange」に一致するドキュメントの結果を、それらが一致するフィールドで並べ替えるにはどうすればよいですか。つまり、フィールド foo に一致するすべてのドキュメントは、フィールド bar などのドキュメントの前に結果に表示される必要があります。

ありがとう!

4

2 に答える 2

1

次の順序でドキュメントのリストが必要です。

  • どこで foo = "オレンジ"
  • バー=「オレンジ」
  • どこで baz = "オレンジ"

これは、単一の find().sort() コマンドでは実行できません。フィールドのキー (名前) でソートする方法はなく、その内容だけでソートする方法がないためです。

ただし、aggregate() を使用すると可能です。

> db.xx.find()
{ "_id" : 1, "bar" : "apple", "baz" : "pear", "foo" : "orange" }
{ "_id" : 2, "foo" : "banana", "bar" : "apple", "baz" : "orange" }
{ "_id" : 3, "foo" : "banana", "bar" : "orange", "baz" : "pear" }
{ "_id" : 4, "foo" : "banana", "bar" : "apple", "baz" : "pear" }
{ "_id" : 5, "foo" : "orange", "bar" : "apple", "baz" : "pear" }
>     db.xx.aggregate([
...         { $match: { $or: [ { foo: "orange" }, { bar: "orange" }, { baz: "orange" } ] } },
...         { $project: { "_id": 1,
...                       "which": { "$cond": [{ "$eq": [ "$foo", "orange" ]}, "01foo", 
...                                { "$cond": [{ "$eq": [ "$bar", "orange" ]}, "02bar", "03baz" ] }
...                       ] }
...         } },
...         { $group: { _id: { which: "$which", _id: "$_id" } } },        
...         { $sort: { "_id.which": 1, "_id._id": 1 } },
...         { $project: { which: { $substr: ["$_id.which", 2, -1] }, _id: "$_id._id" } },        
...     ]);
{
    "result" : [
        {
            "_id" : 1,
            "which" : "foo"
        },
        {
            "_id" : 5,
            "which" : "foo"
        },
        {
            "_id" : 3,
            "which" : "bar"
        },
        {
            "_id" : 2,
            "which" : "baz"
        }
    ],
    "ok" : 1
}

集計が複雑すぎると思われる場合は、その通りです。次のように、データが別の方法で編成されていると、より簡単になります。

{ type: "foo", value: "orange" }

「foo」、「bar」、「baz」の代わりに「ba1」、「ba2」、「ba3」のように、型名をソート可能にします。

集計の詳細については、http ://docs.mongodb.org/manual/reference/aggregationおよびhttp://docs.mongodb.org/manual/tutorial/aggregation-examples/を参照してください。

于 2013-04-02T04:16:10.143 に答える
0

以下のクエリを試してください:

 db.test.find({$or:[{'foo':"orange"},{'bar':"orange"}]}).sort({'foo':-1,'bar':-1})
于 2013-03-08T09:33:49.030 に答える