为啥垃圾被添加到我的 mongodb 中?

Posted

技术标签:

【中文标题】为啥垃圾被添加到我的 mongodb 中?【英文标题】:Why is garbage being added to my mongodb?为什么垃圾被添加到我的 mongodb 中? 【发布时间】:2013-12-18 15:50:38 【问题描述】:

我正在尝试设置一个包含房间对象的 mongodb。谁能明白为什么只有垃圾被添加到我的数据库中?我的房间对象包含 5 个房间,因此添加了正确数量的东西,只是没有正确添加。

这就是我设置数据库的方式:

var setupRoomDB = function()
    var roomSchema = mongoose.Schema(
        title: String,
        description: String,
        exitList: [String]
    );

    Room = mongoose.model("Room", roomSchema);
    addRoomsJS();

db.once('open', setupRoomDB);

这很好用。现在我想用这个对象中包含的东西填充我的数据库:

var rooms = 
    bridge: 
    title: "Bridge",
    description: "You are on the Bridge.  There are big comfy chairs and a big screen here.",
    roomExits: ['sickbay'],
     ,

     engineering: 
    title: "Engineering",
    description: "You are in Engineering.  There are lots of funny instruments, many     smaller screens, and kind of uncomfortable chairs.",
    roomExits: ['sickbay'],
   ,
etc

这就是我尝试这样做的方式:

var addRoomsJS = function ()

    for (var room in rooms)
        var addRoom = function (err, rooms)
            //if the room is already contained
            if (rooms.length!=0)
                //res.redirect("/?error=room already exists");  
                return;
            

            var newRoom = new Room(
                title:room.title,
                description : room.description,
                roomExits: room.roomExits
            );
                newRoom.save();
        ;
        Room.find(title:room.title, addRoom);
    

当我查看存储在我的数据库中的内容时,这就是我得到的:

sarah@superawesome:~/comp2406/adventure-ajax-demo$ mongo
MongoDB shell version: 2.4.6
connecting to: test
> show dbs
local   0.078125GB
test    (empty)
users   0.203125GB
> use users
switched to db users
> show collections
rooms
system.indexes
> db.rooms.find()
 "_id" : ObjectId("529cd5686f854f1512000001"), "exitList" : [ ], "__v" : 0 
 "_id" : ObjectId("529cd5686f854f1512000002"), "exitList" : [ ], "__v" : 0 
 "_id" : ObjectId("529cd5686f854f1512000003"), "exitList" : [ ], "__v" : 0 
 "_id" : ObjectId("529cd5686f854f1512000004"), "exitList" : [ ], "__v" : 0 
 "_id" : ObjectId("529cd5686f854f1512000005"), "exitList" : [ ], "__v" : 0 

【问题讨论】:

对于那些将其标记为重复的人——虽然其中一部分实际上是重复的,但实际问题与此无关。她不明白为什么她认为要保存的数据不存在。 【参考方案1】:

我不知道你说的垃圾是什么意思,但是:

MongoDB 以块的形式分配数据库文件,这就是为什么您的数据库有 0.2 GB 大的原因。在您实际拥有 0.2 GB 数据之前,大小将(大部分)保持不变。达到该限制后,数据库将分配下一个大块。 __v 字段由 Mongoose 创建,用于检查您是否尝试从 2 个不同进程编辑数组。

【讨论】:

我是否应该无法读取数据库中的实际内容?就像它不应该打印类似的东西:标题:桥,描述:blah,roomList:sickbay等? mongodb数据文件分配和问题有什么关系?从 application/shell/etc 的角度来看,文件分配是完全透明的。 @AsyaKamsky 这个问题很模糊。由于 OP 在他的问题中明确添加了数据库大小的结果,我想他可能想知道为什么他的数据库这么大。 查看另一个答案 - 它实际上解释了为什么 OP 试图保存某些数据,但却保存了其他数据。与数据文件的大小或数据库的大小无关。【参考方案2】:
    您已将属性名称从 schmea 更改为 exitList。然而,当您创建房间时,它的名称为roomExits。 您尝试保存数据的方式不是在闭包中捕获房间的值,也不是从rooms 对象中获取实际对象。 __v 是 Mongoose 的 versionKey(Reference 和 how to disable)

当您使用for(var x in obj) 时,x 是键的名称,而不是值。因此,在您的示例中,它只是 bridge 作为字符串。您需要从 rooms 对象中获取实际对象:

var r=rooms[room];

你可以用闭包包裹循环的内容并获取值:

for (var room in rooms) 
    (function(room) 
       var addRoom = ... /* your code here */
    )(rooms[room]);
 

如果你不使用闭包,当 async find 函数返回时,room 的值将不仅仅是一个字符串,它将是 last 值在关联数组中(无论in 处理的最后一个属性是什么)。

【讨论】:

虽然这并没有解决我的问题,但我现在对发生的事情有了更好的了解,所以谢谢。当我最终弄清楚时,我会用答案更新我的问题 - 我已经能够在数据库中放置正确的项目,但我现在正在添加重复项。 如果这不起作用会有什么结果?我不明白为什么这没有回答你的问题?

以上是关于为啥垃圾被添加到我的 mongodb 中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 mongoDB 托管 mongoid.yml 的 uri 设置无法正常工作?

为啥 JScrollpane 没有添加到我的 TextEditor 中的 JTextArea?

为啥要将 entitlements.plist 添加到我的项目中?

为啥我不能将这些值插入到我添加到此数据库的表中?

为啥没有查询参数被传递到我的 NancyFX 模块?

尝试使用自动布局将 UIButton 添加到我的视图中,但它没有出现。为啥? [关闭]