当前位置: 首页 > 知识库问答 >
问题:

猫鼬:我需要子文档来生成“_id”,而不是“id”来搜索文档数组

凤财
2023-03-14

我跟随Simon Holmes的《变得卑鄙》一书,但是,我偶然发现了一个关于子文档ID的问题。我试图使用mongoose文档提供的“MongooseDocumentArray.id(id)helper函数在“Location document”中请求“review document”。但是,我的所有子文档都生成“id”,但前面提到的函数需要“_id”,因此返回“null”对象。

函数说明:搜索数组项以查找具有匹配id的第一个文档。

这里的问题是什么?我的父文档是“Location”,它的id带有“\u id”,这让我更加困惑。。。下面的代码片段分别说明了嵌套模式设置、从包含审阅子文档的数据库返回的位置对象以及执行查询的路由的控制器函数。

var mongoose = require("mongoose");

var reviewSchema = new mongoose.Schema({    
    author: String,
    rating: {type: Number, required: true, min: 0, max: 5},
    reviewText: String,
    createdOn: {type: Date, "default": Date.now}
});

var locationSchema = new mongoose.Schema({
    name: {type: String, required: true},
    address: String,
    rating: {type: Number, "default": 0, min: 0, max: 5},
    facilities: [String],
    coords: {type: [Number], index: "2dsphere"},
    reviews: [reviewSchema]   
});

mongoose.model('Location', locationSchema);

返回的位置对象,显示包含id而不是\u id的子文档

对于以下代码段,这是相关的路由:

router.get("/locations/:locationid/reviews/:reviewid", ctrlReviews.reviewsReadOne);



module.exports.reviewsReadOne = function(req, res){ 
if(req.params && req.params.locationid && req.params.reviewid){
    Loc.findById(req.params.locationid)
        .select("name reviews")
        .exec(function(err, location) {
            var response, review;
            if(location.reviews && location.reviews.length > 0){                    
                // This returns zero, because the function requires _id
                // but all subdocuments have path/properties called id
                review = location.reviews.id(req.params.reviewid);
                console.log(review);

                if(!review){
                    sendJsonResponse(res, 404, {
                        "message": "reviewid not found"
                    });
                } else {
                    response = {
                        location: {
                            name: location.name,
                            id : req.params.locationid
                        },
                        review: review
                    };
                    sendJsonResponse(res, 200, response);
                }
            }
    })
}

};

共有2个答案

伊富
2023-03-14

实际上我正在读这本书,这本书非常棒,提供了很多关于平均堆栈的简单优化体系结构的信息,问题在于使用时书中的代码:

$推:{评论:{作者:'Simon Holmes', id: Object tid(),...

在这段代码中,使用id而不是_id,因此正确的脚本是:

db.locations.update({名称:‘星杯’},{$推:{评论:{作者:‘西蒙·霍姆斯’,_id: ObjectId(),评级: 5,时间戳:新日期(“2013年7月16日”),评论文本:“多棒的地方。我不能说足够好"}}});

"当通过Mongo shell添加新的子文档时,您需要将id指定为_id。"(福尔摩斯S.)https://forums.manning.com/posts/list/35152.page

祁霖
2023-03-14

将您的模式更改为以下内容。

var locationSchema = new mongoose.Schema({
    name: {type: String, required: true},
    address: String,
    rating: {type: Number, "default": 0, min: 0, max: 5},
    facilities: [String],
    coords: {type: [Number], index: "2dsphere"},
    reviews: [{
       author: String,
       rating: {type: Number, required: true, min: 0, max: 5},
       reviewText: String,
       createdOn: {type: Date, "default": Date.now
    }]    
});
 类似资料:
  • 我有一个简单的模式,里面有一个数组。当我创建一个包含映射数组中的项的新项时,映射数组中的项会自动分配_ID。但是,当我试图将项添加到现有项的映射数组时,新的映射是用的_id创建的。我如何让mongoose为我生成这个_ID?我在文件里找不到。

  • 问题内容: 我在子文档的Mongoose中尝试执行findOne查询,但运气不佳… 我的架构如下所示: 我只需要从我使用此查询的文档中查找用户的电子邮件 任何帮助,将不胜感激! 问题答案: 您缺少对象的级别,因此您的代码需要更改为以下内容:

  • 我有结构相当复杂的MongoDB文档: 高层组织(一个要素) 我想通过lastname+firstname+patronym组合在一个查询中进行搜索。查询应该支持多个lastnames、firstnames、patronyms(在$in的帮助下)(用于一个人的不同名字,即jon、john、johny) 我当前的代码返回组织内部有lastname+firstname+patronym组合,但我需要在

  • 问题内容: 我的文件 夹Folder 具有以下架构: 因此,对于每个页面,我可以拥有许多权限。在CMS中,有一个面板,其中列出了所有文件夹及其权限。管理员可以编辑一个权限并保存。 我可以很容易地用其权限数组保存整个 Folder 文档,其中只修改了一个权限。但是我不想保存所有文档(实际架构中包含更多字段),所以我这样做了: 但是问题是 烫发 总是 不确定的 !我试图以这种方式“静态地”获取许可:

  • 我想知道mongoose是否有一些方法可以通过id集更新多个文档。例如: 我想知道的是,如果猫鼬能做这样的事情: 其中,ids是一个id数组,如['id1','id2','id3']-示例数组。对于find,同样的问题。

  • 问题内容: 我对在我的主模式中使用子文档和更深层的优缺点感到好奇: 要么 我目前在各处使用子文档,但主要是想知道性能或查询我可能遇到的问题。 问题答案: 根据文档,它是完全一样的。但是,使用Schema也会添加一个字段(只要您没有禁用该字段),并且大概会使用更多资源来跟踪子文档。 备用声明语法 v3中的新增功能 如果不需要访问子文档架构实例,则还可以通过简单地传递对象文字来声明子文档[…]