如何对嵌套文档数组的第一个或最后一个文档的字段进行排序

时间:2012-08-03 16:54:18

标签: mongodb

我的文档看起来像这样

{
  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数组的第一个,第二个或最后一个文档的nested_documents字段获取已排序的文档?如果是,那我该怎么办呢?

2 个答案:

答案 0 :(得分:1)

很抱歉打扰这个问题。我意识到有一个位置运算符可用于查询数组,因此在排序时尝试了该运算符并且它有效。

可以使用位置运算符来完成。这就是我从shell中做到的方式

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

答案 1 :(得分:1)

您可以使用positional operator按数组中的特定索引进行排序:

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);