【问题标题】:Search for an object in an array Mongoose在数组 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

标签: node.js mongodb angular mongoose mongodb-query


【解决方案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);
        }
    );
});

【讨论】:

  • 我现在有病人,但如果我也能得到那个病人的治疗,那就太好了。现在我得到了除治疗外的所有患者属性。
  • 我在使用聚合框架时也得到了治疗,谢谢!
  • 您也介意检查一下这个问题吗? stackoverflow.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 已经为你解答了。请参考。
猜你喜欢
  • 2015-11-10
  • 2015-07-23
  • 2012-01-13
  • 1970-01-01
  • 2023-01-05
  • 2011-04-07
  • 2015-09-12
  • 2013-09-03
  • 1970-01-01
相关资源
最近更新 更多