关于使用mongoose修改子文档中的数据的问题
发布于 8 年前 作者 belowMichi 5296 次浏览 来自 问答

###主要需要是实现的就是一个添加好友的功能

var User= mongoose.model(user,new Schema({
        name:{type:String,required:true},
        password:{type:String,required:true},
        nick:{type:String,required:false},//nick name可以为空
        friends: [{
            group: {type:String,required:true},
            list: [
			{Fid:mongoose.Schema.Types.ObjectId}
			]
        }
        ]
    }));

现在已知了一个用户的 name 和好友分组的名称group 那么如何先找到这个文档 之后再进入到 friends 之后在根据group 找到对应的list 让后将需要插入的好友id插入进去呢??

使用$push 貌似是行不通 因为已经是第二个子文档了 找了mongoose的文档 也是在找不到 或许可以使用query的链式查询? 新手是在不太懂,求指教,谢谢

4 回复
User.findOne({name: name}).exec(function (err, user) {
	user.friends[group].push(friendId);
	user.save();
});

更新。。。 看错了……上面不对

Population

@SinalVee 感谢回答 group不是主键所以应该不能通过它找到list 所以其实我想知道这种多重嵌套的情况是不是有方法能够通过多次使用find()和select()等函数来进行查询 例如

var query = User.findOne({name: name});
query.select("friends").find({group: group}).select("list").push(friendId)

这样。

不知道这种写法有没有问题 但是如果可以的话这样不管有几层嵌套都没有问题了

而关于populate的话是用来引用其他文档的吧 在这里的Fid那应该用得上?看了下文档 感觉还是很有用的

请赐教 谢谢!

@belowMichi 应该是不能,我觉得user model嵌套的太深了,可不可以考虑拆分一个friend model?

@SinalVee 嗯 的确就是这个问题 因为嵌套了两层 如果只是要更改单层子文档的话 还可以直接使用 update({group: group}, {"$push": {friends:{group:group }}) 但是在这种需要多种嵌套的场景的话 例如 论坛贴吧这种模式之下 也是 theme主题帖子—>回复楼主—>回复层主 这种深层嵌套的情况,如下:

var themeModel = modelBase._mongoose.model('theme',modelBase._schema({
    theme_name:String,
    posts:[{
        post_id:String,
        title:String,
        content:String,
        time:Number,
        user:{type:objectId,ref:'user'},
        img_list:[String],
        suppost:Boolean,
        post_ref:String,
        comments:[{
            content:String,
            time:Number,
            from:{type:objectId,ref:'user'},
            to:{type:objectId,ref:'user'}
        }]
    }]
}),'theme');

我在网上找到了相关解决方法, 多重嵌套,但是它实际上是将model结构分解了 使用了aggregate() unwind()这些mongdb的api

但是mongoose的话就没有解决这个问题的专门方案了么?

以下是我的想法: 其实我知道

var query = User.findOne({name: name}); 

的query 返回的是mongoose对象,所以才能使用findOne() find()等函数 那么query.select(“friends”) 作为一个 子文档应该也是一个mongoose对象吧,所以应该也可以继续使用find()函数吧 以上的思路有什么错误麻烦指出来 谢谢

还有假如 拆分一个friend model出来 使用Population的话 对应的查找更新方法又是怎样的呢?

问题有点多 请指教!

回到顶部