在猫鼬中改变文件的顺序

时间:2014-09-01 14:33:34

标签: node.js mongodb mongoose

我第一次使用mongoose.js搞砸了数据库,但我无法弄清楚对我来说似乎是非常基本的功能。 我想在数据库中放置一个特定文档,以便在我获取文档时更新文档的加载顺序。 除了可能的.sort()之外,我找不到一些内置方法,但这意味着我必须跟踪每个实例的索引,当我想要更改顺序然后对其进行排序时相应地更改它们基于那个新属性的数据库,这似乎重新发明了我的轮子。

我只是忽略了一些关于数据库的基本概念,我不应该这样做吗?或者我错过了我正在寻找的功能?

2 个答案:

答案 0 :(得分:2)

MongoDB不提供任何明确修改集合中文档自然顺序的能力,并且可能会在更新时在集合中移动文档。

如果您希望按特定顺序返回文档,则文档必须包含一个您可以排序的字段,以便按顺序放置它们。要使排序具有高效性,通常还需要在该字段上创建索引。

答案 1 :(得分:1)

您可以使用旁路来实现 这种行为:

假设您有聊天室,并且希望最新的聊天室位于列表的顶部。

您可以创建一个包装文件,其中包含房间子文件的阵列

let RoomsSchema = Schema({
   isActive: { type: Boolean },
   name: { type: String, required: true },
   ownerId:{type: String},
   participants: { type: Array },
   messages: [MessageSchema],
   updateTime: { type: Date },
   creationTime: { type: Date },
}, { versionKey: false });

let MainDoc = Schema({
   rooms:[RoomsSchema]
});

然后假设您将具有一个架构函数来添加消息,如下所示:

MainDoc.statics.ADD_Message = async function (roomId, message) {
    let main = await this.findOne({});
    let room = await main.rooms.id(roomId);
    room.messages.push(message);
    let roomIdx = main.rooms.findIndex(x => x._id == room._id);

    if (roomIdx > -1) {
        main.rooms.splice(roomIdx, 1);
        main.rooms=[room,...main.rooms];
     }
     return main.save();
};