使用数组字段进行mongodb排序

时间:2014-02-19 17:02:05

标签: mongodb meteor

这是我的mongodb文件

{
    "_id" : "a3s6HzG9swNB3bQ78",
    "comments" : [ 
        {
            "cmt_text" : "opp",
            "vCount" : 2,

        }, 
        {
            "cmt_text" : "o2",

            "vCount" : 5,

        }, 
        {
            "cmt_text" : "o3",

            "vCount" : 3,

        }
    ],

    "question" : "test ques 3"
}

我想使用vCount字段对结果进行排序如何实现此目的

我尝试了以下但似乎无法正常工作

Coll.findOne( {_id:this._id},{sort:{ "comments.vCount" : 1 }});

Coll.findOne( {_id:this._id},{sort:{ "comments.$.vCount" : 1 }});
谁知道这个???

修改

我们只返回一个文档,我想根据vCount显示该文档注释数组值。我的代码

{{#each all_comments.comments}}

    <br>{{cmt_text}}</p>
{{/each}}

我想要显示如下

o2
o3
opp

修改

这在shell中工作正常

db.testCol.aggregate([
                    { $unwind: "$comments" },
                    { $group: { _id: { id:"$_id", vcount:"$comments.vCount"} } },
                    { $sort: { "_id.vcount":1 }}
                  ]) 

为什么它不能在我的流星应用程序中工作

error:object has no method aggregate

3 个答案:

答案 0 :(得分:3)

这是正确的:

Coll.findOne( { _id: this._id }, { sort: { 'comments.vCount' : 1 } } );
$前面

sort

修改

如果要对嵌套数组进行排序,请查看here

答案 1 :(得分:2)

aggregate目前无法在客户端上使用。您可以只执行findOne,提取comments数组,并将已排序的版本返回给模板。例如:

Template.allComments.helpers({
  comments: function() {
    var coll = Coll.findOne(this._id);
    return _.sortBy(coll.comments, function(comment) {
      return -comment.vcount;
    });
  }
});
<template name="allComments">
  {{#each comments}}
    <br>{{cmt_text}}</p>
  {{/each}}
</template>

答案 2 :(得分:1)

您应该学习聚合来处理子文档,数组以及数组中的子文档。对于你的排序问题,这可行。

db.testCol.aggregate([
                    { $unwind: "$comments" },
                    { $group: { _id: { id:"$_id", vcount:"$comments.vCount"} } },
                    { $sort: { "_id.vcount":1 }}
                  ]) 

编辑:根据您的修改,您可以添加$project运算符;

db.testCol.aggregate([
                        { $unwind: "$comments" },
                        { $group: { _id: { id:"$_id", vcount:"$comments.vCount", text:"$comments.cmt_text"} } },
                        { $sort: { "_id.vcount":1 }},
                        { $project: { text: "$_id.text", _id:0}}
                      ])