Mongodb数据库迁移与嵌入式查询

时间:2014-07-27 16:55:40

标签: mongodb mongodb-query

目前在我的数据库中,我将messages个对象设置如下。

{
    "name" : "System",
    "message" : "Sean Callahan has entered the room.",
    "time" : 1406479167270,
    "type" : "system_message",
    "room" : "helloroom",
    "_id" : "4yeHzhHAQmGJNtHww"
}

我希望基本上迁移我的数据,以便每条消息都有一个roomId,将其指向适当的房间。目前,这是由room属性完成的,我知道由于各种原因,我会以我的方式看错。

我的房间对象设置如下。

{
    "_id:" xxxxxxxxx
    "room_name:" "testingroom"
}

所以我希望有一种方法可以运行一个单行程序,只需根据设置的当前roomId属性为每个当前消息添加正确的room

我在思考......

db.messages.update({}, {$set: {roomId: db.rooms.findOne({room_name: room})._id}})

截至目前,我的房间没有定义,这很有道理。但我似乎无法做到正确,而这可能在单行查询中无法实现。

1 个答案:

答案 0 :(得分:0)

正如您所发现的,在单行查询中这是不可能的,因为您需要连接来自两个集合的数据。

以下是如何在mongo shell中添加缺少字段的示例:

db.messages.find(
    { roomId: { $exists: false} }
).forEach(function(room) {
    var roomId = db.rooms.findOne({room_name: room.room});
    if (roomId._id) {
        db.messages.update(
            { _id: room._id },
            { $set: { roomId: roomId._id }}
        )
    }
})

您可以通过一些错误检查来整理这个问题,对于大型集合的更新,请考虑使用Bulk Update API(仅在MongoDB 2.6 +中可用)。