我们说我的收藏中有四份文件:
{u'a': {u'time': 3}}
{u'a': {u'time': 5}}
{u'b': {u'time': 4}}
{u'b': {u'time': 2}}
是否可以按字段对时间进行排序' time'这在“a'和' b'文件?
谢谢
答案 0 :(得分:0)
您可以使用 aggregation ,以下代码已经测试。
db.test.aggregate({
$project: {
time: {
"$cond": [{
"$gt": ["$a.time", null]
}, "$a.time", "$b.time"]
}
}
}, {
$sort: {
time: -1
}
});
或者,如果您还想要返回原始字段:gist
或者,您可以使用自定义比较功能(未测试,仅出于说明目的)将结果返回后进行排序
db.eval(function() {
return db.mycollection.find().toArray().sort( function(doc1, doc2) {
var time1 = doc1.a? doc1.a.time:doc1.b.time,
time2 = doc2.a?doc2.a.time:doc2.b.time;
return time1 -time2;
})
});
答案 1 :(得分:0)
不,您应该将数据放入通用格式,以便在公共字段上对其进行排序。如果你想要它仍然可以嵌套,但它需要具有相同的路径。
答案 2 :(得分:0)
您可以使用aggregation framework
。
$project
所有文档的公共字段,以便$sort
阶段可以使用该字段中的值来sort
文档。a.time
是否存在
然后,记录将按照b.time
的其他值排序。代码:
db.t.aggregate([
{$project:{"a":1,"b":1,
"sortBy":{$ifNull:["$a.time","$b.time"]}}},
{$sort:{"sortBy":-1}},
{$project:{"a":1,"b":1}}
])
consequences
这种做法:
aggregation pipeline
你都不会index
创建理想情况下,您可以询问向您发送数据的源系统,以标准化其格式,例如:
{"a":1,"time":5}
{"b":1,"time":4}
如果您在index
字段中创建一个time
,那么您的查询可以使用db.t.ensureIndex({"time":-1});
。
db.t.find({}).sort({"time":-1});
代码:
{{1}}