在数组 Mongoose 中搜索对象

Posted

技术标签:

【中文标题】在数组 Mongoose 中搜索对象【英文标题】:Search for an object in an array Mongoose 【发布时间】:2017-05-21 08:00:22 【问题描述】:

假设我有一个名为部门的模型。我有一个带房间的数组,每个房间都有一个病人(有一个病人)。

我想用等于请求 id 的患者编号来获取患者。有没有办法做到这一点?

var department = mongoose.model('department', 
    departmentName: String,
    rooms: [
        
            roomNumber: String,
            width: Number,
            height: Number,
            posX: Number,
            posY: Number,
            sanitary: Boolean,
            childcareArea: Boolean,
            lounge: Boolean,
            patient: 
                patientnr: Number,
                firstname: String,
                lastname: String,
                reasonOfHospitalization: String,
                dateOfHospitalization: Date,
                expectedDateOfDischarge: Date,
                vegetarian: Boolean,
                needsHelp: Boolean,
                comments: String,
                department: String,
                roomNumber: String,
                nextTreatment: 
                    type: String,
                    shortDescription: String,
                    timestamp: Date
                
            
        
    ]
);

//get patient with id
app.get('/api/departments/patients/:id', function(req, res) 
    department.find("patient": $all :[60022], function (err, patient) 
        if (err)
            res.send(err)
        res.json(patient);
    );
);

【问题讨论】:

欢迎来到 Stack Overflow。为了能够为您提供一些帮助,如果提供您为找到解决方案所做的尝试将会很有帮助。另外,您可能想Read This Help Article。 【参考方案1】:

您可以在投影中使用 $elemMatch,如下所示:

//get patient with id
app.get('/api/departments/patients/:id', function(req, res) 
    department.findOne(
         "rooms.patient.patientnr": parseInt(req.params.id) , 
         
            "rooms": 
                "$elemMatch": 
                    "patient.patientnr": parseInt(req.params.id)
                
            
        ,
        function (err, dept) 
            if (err)
                res.send(err)
            var patient = dept.rooms[0].patient;
            res.json(patient);
        
    );
);

$ positional operator

//get patient with id
app.get('/api/departments/patients/:id', function(req, res) 
    department.findOne(
         "rooms.patient.patientnr": parseInt(req.params.id) , 
         "rooms.$": 1 ,
        function (err, dept) 
            if (err)
                res.send(err)
            var patient = dept.rooms[0].patient;
            res.json(patient);
        
    );
);

或使用聚合框架:

//get patient with id
app.get('/api/departments/patients/:id', function(req, res) 
    department.aggregate(
        [
             "$match":  "rooms.patient.patientnr": parseInt(req.params.id)  ,
            
                "$project": 
                    "room": 
                        "$arrayElemAt": [
                            
                                "$filter": 
                                    "input": "$rooms",
                                    "as": "room",
                                    "cond": 
                                        "$eq": [
                                            "$$room.patient.patientnr", 
                                            parseInt(req.params.id)
                                        ]
                                    
                                
                            , 0
                        ]
                    
                
            
        ],  function (err, results) 
            if (err)
                res.send(err)
            var patient = results[0].room.patient;
            res.json(patient);
        
    );
);

【讨论】:

我现在有病人,但如果我也能得到那个病人的治疗,那就太好了。现在我得到了除治疗外的所有患者属性。 我在使用聚合框架时也得到了治疗,谢谢! 您也介意检查一下这个问题吗? ***.com/questions/41509547/… 基本上需要做的是编辑此患者信息并将其发布回 mongoDB【参考方案2】:

你可以试试这个

//get patient with id
app.get('/api/departments/patients/:id', function(req, res) 
    var id = req.params.id;
    department.find("rooms.patient.patientnr": id, function (err, patient) 
        if (err)
            res.send(err)
        res.json(patient);
    );
);

【讨论】:

几乎,这将把我的房间和病人还给整个科室。但我只需要病人回来。 哦。您只想返回患者对象吗? 是的,如果可能的话:) 你可以使用 unwind 然后 好吧,我猜@chridam 已经为你解答了。请参考。

以上是关于在数组 Mongoose 中搜索对象的主要内容,如果未能解决你的问题,请参考以下文章

在数组 Mongoose 中搜索对象

mongoose基本增删改查

mongoose的基本操作

Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中

(猫鼬)如何在用户集合中搜索会话数组属性内的对象内的令牌

无法使用 $pull (Mongoose) 为用户模型删除数组中的对象