目前在我的数据库中,我将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}})
截至目前,我的房间没有定义,这很有道理。但我似乎无法做到正确,而这可能在单行查询中无法实现。
答案 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 +中可用)。