2012-08-03 120 views
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场的基础上排序文档,第二或nested_documents数组的最后一个文档?如果是的话,我该怎么做?

回答

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

我没有得到'从$ elemMatch查询的动态位置不可用于排序'。 – lovesh 2012-08-03 17:59:50

+1

我的错误。我的意思是指[动态位置运算符](http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator),它允许您使用'$'来引用原始查询中的字段用于更新。我只是提出了这个问题,因为在另一个答案中提到了这个问题,这个问题已经被删除了。 – jmikola 2012-08-03 18:27:52