首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序多个集合与子文档

排序多个集合与子文档
EN

Stack Overflow用户
提问于 2017-01-20 23:13:01
回答 1查看 41关注 0票数 0

我是MongoDB的新手,也是nodejs的新成员。很抱歉,如果我问了一个简单的问题,但我只是在创建结构,所以现在是改变的最佳时机。

我目前的结构(附文件):

代码语言:javascript
复制
 var Channels = new Schema({
        _id: {type: Schema.Types.Number, ref: 'Channel'},
        type: {type: String, default: ''},
        subscriber: {type: Boolean, default: false},
        Points: {type: Number, default: 0},
        mPoints: {type: Number, default: 0},
        lastSeen: {type: Date, default: Date.now() }
    });


    var ViewerSchema = new Schema({
        _id:  Number,
        name: String,
        displayName: String,
        Channels: [Channels]
    });

    var Viewer = mongoose.model('Viewer', ViewerSchema, 'Viewers');

从那时起,我打算用它来做什么。

Viewer.Channels[id].mPoints排序,就像按月点对单个通道进行排序一样。(id为常量)

简单的例子:

代码语言:javascript
复制
{
    "_id" : 46761135,
    "name" : "h4ckhers",
    "displayName" : "h4ckhers",
    "Channels" : [
        {
            "_id" : 46761135,
            "mPoints" : 0,
            "Points" : 0,
            "subscriber" : false,
            "type" : "mod"
        },
        {
            "_id" : 37259814,
            "mPoints" : 0,
            "Points" : 0,
            "subscriber" : false,
            "type" : null
        },
        {
            "_id" : 71978007,
            "mPoints" : 10,
            "Points" : 0,
            "subscriber" : true,
            "type" : null
        }
],
    "__v" : 2
},
{
    "_id" : 144771688,
    "name" : "sevo",
    "displayName" : "sevo",
    "Channels" : [
        {
            "_id" : 71978007,
            "mPoints" : 5,
            "Points" : 0,
            "subscriber" : false,
            "type" : null
        }
],
    "__v" : 0
},
{
    "_id" : 43354629,
    "name" : "son1903",
    "displayName" : "Son1903",
    "Channels" : [
        {
            "_id" : 71978007,
            "mPoints" : 9,
            "Points" : 0,
            "subscriber" : false,
            "type" : null
        }
],
    "__v" : 0
}

当我使用Viewer.Channels['71978007'].mPoint时,它的输出应该类似于(h4ckhers、Son1903、sevo)。我如何做到这一点,我应该为此使用多个文档,如果应该的话,它们应该如何索引。(如果是选项,我想用mongodb处理,而不是在javascript中处理)

注意:每个观看者最多有100个频道。(但在现实世界中,观众最多有15-20个频道,平均拥有5-8个频道)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-21 18:32:10

我自己找到了解决方案。以下是我的疑问:

代码语言:javascript
复制
db.Viewers.find( { "Channels._id": 71978007 } ).sort( { "Channels.mPoints": -1 } )

我的索引:

代码语言:javascript
复制
db.Viewers.createIndex( { "Channels._id": 1, "Channels.mPoints": -1 } )

用于此查询的索引:Channels._id_1_Channels.mPoints_-1

参考资料:https://docs.mongodb.com/manual/core/index-multikey/

旧的部分解决办法:

我找到了这个查询,这是做的事情,但我仍然想知道性能。

代码语言:javascript
复制
 db.Viewers.aggregate([
 {$unwind:"$Channels"},
 {$match:{"Channels._id":71978007}},
 {$sort:{"Channels.mPoints":-1}}])

我为这个查询创建了这个索引:

代码语言:javascript
复制
db.Viewers.createIndex( { "Channels._id": 1, "Channels.mPoints": -1 } )

但当我用

代码语言:javascript
复制
db.Viewers.aggregate( [ { $indexStats: { } } ] ).pretty()

答复如下:

代码语言:javascript
复制
{
    "name" : "Channels._id_1_Channels.mPoints_-1",
    "key" : {
        "Channels._id" : 1.0,
        "Channels.mPoints" : -1.0
    },
    "host" : "Hackhers:27017",
    "accesses" : {
        "ops" : NumberLong(0),
        "since" : ISODate("2017-01-21T18:46:53.764Z")
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41773863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档