Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongoose/node.js如何查找、填充、做事情';人口减少';更新_Node.js_Mongodb_Mongoose - Fatal编程技术网

Mongoose/node.js如何查找、填充、做事情';人口减少';更新

Mongoose/node.js如何查找、填充、做事情';人口减少';更新,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想给db打一个漂亮而优雅的电话,但总是因为缺乏猫鼬经验而痛苦 希望我不是太烦人,我只是在我的文档google堆栈挖掘技能失败时才尝试解决堆栈溢出问题 我想做的是: -在数据库中查找文档 -填充此文档内的数组(架构中的此数组是来自架构UserMeta的Objectids的数组) -通过套接字将其发送到更好的地方 -使用另一个\u id引用到UserMeta -将此更新保存到db&作为varcurrentroom的未来参考 问题发生在最后两个步骤中,因为我无法“取消”文档,我已经得到了响应并更新了

我想给db打一个漂亮而优雅的电话,但总是因为缺乏猫鼬经验而痛苦

希望我不是太烦人,我只是在我的文档google堆栈挖掘技能失败时才尝试解决堆栈溢出问题

我想做的是:

-在数据库中查找文档
-填充此文档内的数组(架构中的此数组是来自架构
UserMeta
Objectid
s的数组)
-通过套接字将其发送到更好的地方
-使用另一个
\u id
引用到
UserMeta

-将此更新保存到db&作为var
currentroom的未来参考

问题发生在最后两个步骤中,因为我无法“取消”文档,我已经得到了响应并更新了它,请进一步保存它

目前,我在没有人口的情况下就是这样做的:

Room.findOne({ Roomid: roomid }, function (err, oldRoom) {
    client.emit('others', oldRoom);
    oldRoom.UsersMeta.push(currentUser._id);
    oldRoom.save(function (err, newRoom) {            
        currentroom = newRoom;
    });
})
我可以通过toJSON将需要的文档从parrent
UserMeta
暴力复制到这个
Room
文档,然后手动维护它们。但是,如果有一种方法可以通过handy
mongoose
工具自动完成这项工作,我愿意采用这种方法。当然是出于好奇

这是我上一个问题的继续- 只是一句话,你真的不需要去那里

Upd:问题是我需要在查询中使用
findOne
运行
populate()
,因此作为响应,我得到了
oldRoom
已经填充了
\u id
s

Room.findOne({ Roomid: roomid }).populate('UsersMeta').exec(function (err,       oldRoom) {
    if (err) {
        console.log(err);
    }
    else if (oldRoom) {
        console.log(oldRoom.UsersMeta)
        client.emit('others', oldRoom.UsersMeta);
        oldRoom.UsersMeta.push(currentUser._id);
        oldRoom.save(function (err, newRoom) {
            currentroom = newRoom;
            console.log(newRoom);
        });
    }
    else { console.log('nothing found') };
})
upd2:所以我想,如果我把新的
\u id
推到已经填充的
oldroom
并保存它,在db中它将自动显示为一组应该的
\u id
。然而,我现在很困惑,如果我将继续使用这个
currentroom
引用,因为它已经被计算过了,我如何才能安全地从填充的数组中删除一些内容,而不完全从数据库中删除填充的条目

upd3:啊,我脑子里乱七八糟的。出于某种奇怪的原因,我认为对每个套接字客户端保存在变量中的文档的引用将始终指向数据库中的最新文档,并且我将能够通过它来处理此文档,这表明需要多次使用find db工具来获取此引用。。。我需要重新思考我的数据库逻辑。
所以

那么有一个问题。如果用户连接到
RoomSchema
中的文档
RoomSchema
,并且用户是套接字用户,即他有个人作用域,我可以在其中存储他的个人会话详细信息。我是否可以以某种方式存储指向此特定
房间
文档的直接链接,以便在用户更改房间名称时,通过整个数据库显示搜索此房间的需要。如果我需要searh-似乎更好的做法是保存用户所在房间的id,然后根据此id在db中查找房间并更改其名称,对吗?

以下是仅使用id获取UserMeta的查询

Room.findOne({ Roomid: roomid },function (err, oldRoom) {

});

请你重新解释一下这个问题,我不确定到底是什么问题。我需要在找到它后发送、更新和保存
doc
。在该文档的架构中有
UsersMeta:[{type:mongoose.schema.Types.ObjectId,ref:'UserMeta'}],
。据我所知,要在作为人口主题的
用户数据中添加另一个
\u id
,并保存找到的
文档
,我需要不填充它。但是,在保存之前,我需要将
UserMeta
从找到的
doc
中发送出去,并且必须填充它。如果您不想删除UserMeta,可以通过删除newRoom来删除它。UserMeta我希望它在
doc
中,但只能通过它的
\u id
显示,为了能够在将来使用这些
UserMetas
再次填充此
doc
,事实上,在对db的每一次此类调用中。原因是自动跟踪
UserMeta
集合中的所有更改。也就是说,如果房间中的一些
UserMeta
在其原始
UserMeta
集合中发生了更改,我只想在需要时调用
room
上的
populate()
,并且房间中有实际最新的
UserMeta
,这就是为什么我需要在未填充状态下保存
room
,能够在将来通过人口更新其
UserMeta
。据我所知,我无法通过
delete something
从mongoose文档中删除任何内容,除非我首先将其转换为
JSON/object
,这正是我之前所做的,正如您在讨论中看到的,问题是我将如何在这个查询中填充找到的文档,以便使用填充的文档进行进一步的操作?如mongoose中的示例,doc populate必须在查询中,对这个文档进行假设,我甚至没有尝试调用oldRoom.populate()也许这里有一个陷阱,将在momentok中尝试它似乎我可以这样调用它
oldRoom.populate('UsersMeta',function(err,populated){console.log(populated),console.log(oldRoom)}
但是现在
oldRoom
populated
都是相同的-即都是populated,所以我不能再使用未填充的
oldRoom
来更新新的
\u id
并保存。啊,等等,我犯了一个错误,检查再次检查,是的,它们都被填充了。我现在看到的唯一方法是首先更新,保存,然后填充,转换为JSON,以某种方式去掉更新的部分并发送给用户。我想如果我推动它更新,我只需要去掉数组中的最后一行。如果保证了推送的顺序,即通过添加到mongoose文档中数组的末尾,推送的正常行为