0

私のドキュメントは次のようになります

{
  field1: somevalue,
  field2: some other value,


  nested_documents: [ // array of nested document
    { ip: , session_id: , datetime: }, // first nested document
    { ip: , session_id: , datetime: }, // second nested document

    // ...many more nested documents
  ]
},

配列datetimeの最初、2番目、または最後のドキュメントのフィールドに基づいてソートされたドキュメントを取得することは可能ですか? nested_documentsはいの場合、どうすればできますか?

4

2 に答える 2

1

質問でお手数をおかけして申し訳ありません。配列のクエリに使用できる位置演算子があることに気付いたので、並べ替え中にその演算子を試してみたところ、うまくいきました。

これは、位置演算子を使用して実行できます。これは私がシェルからそれをした方法です

sorting by the first nested document's field

   db.sample.find().sort({"nested_documents.0.field_name" : -1})   // for descending order sort

sorting by the second nested document's field

   db.sample.find().sort({"nested_documents.1.field_name" : -1})   // for descending order sort

Now for sorting by last document's field i have to keep track of length of the array so if length of array is 10 my query would be

   db.sample.find().sort({"nested_documents.9.field_name" : -1})   // for descending order sort
于 2012-08-03T17:19:42.057 に答える
1

位置演算子を使用して、配列内の特定のインデックスで並べ替えることができます。

db.foo.drop();

db.foo.insert({
    _id: 1,
    docs: [
        { date: new ISODate("2012-01-01T00:00:00Z") },
        { date: new ISODate("2010-01-01T00:00:00Z") }
    ]
});

db.foo.insert({
    _id: 2,
    docs: [
        { date: new ISODate("2011-01-01T00:00:00Z") },
        { date: new ISODate("2013-01-01T00:00:00Z") }
    ]
});

jsTest.log("Sorting by first embedded document's date, ascending");
db.foo.find({}, { "docs.date": 1 }).sort({"docs.0.date": 1}).forEach(printjson);

jsTest.log("Sorting by second embedded document's date, ascending");
db.foo.find({}, { "docs.date": 1 }).sort({"docs.1.date": 1}).forEach(printjson);
于 2012-08-03T17:31:31.140 に答える