Mongoose возвращает нулевое значение при поиске по явно идентифицированному _id - PullRequest
0 голосов
/ 15 февраля 2019

Я новичок в MongoDB / Mongoose и недавно запустил проект с использованием MongoDB, Node и Express, и я столкнулся с проблемой, когда при попытке выполнить запрос с помощью mongoose по _id, который существует, результат равен нулю.Я обнаружил похожие проблемы, но большинство заявляет, что mongoose запрашивает имя коллекции во множественном числе. Я подтвердил, что это не моя проблема, включив отладку для mongoose и убедившись, что коллекция имеет правильное имя.

Мой документживет в базе данных отчетов и коллекции клиентов, в настоящее время в этой коллекции только один документ.

{
    "_id" : ObjectId("5c64881002ea07789e9444aa"),
    "fields" : {
        "Customer ID" : "_id",
        "First Name" : "first_name",
        "Last Name" : "last_name",
        "Contact Type" : "opt_history.contact_type",
        "Opt In Date" : "opt_history.opt_in_date",
        "Opt Out Date" : "opt_history.opt_out_date",
        "Location Opt In" : "opt_history.location_opt_in",
        "Location Opt Out" : "opt_history.location_opt_out"
    },
    "filters" : {
        "company" : {
            "validation" : {
                "required" : true
            },
            "query_value" : "company:%company_id%"
        },
        "opt_history" : {
            "validation" : {
                "required" : true
            },
            "query_value" : {
                "opt_in" : {
                    "if" : {
                        "start_date" : {
                            "if" : {
                                "end_date" : "{$and: [{\"opt_history.opt_in_date\":{$gte: %start_date%, $lte: %end_date%}}, {\"opt_history.opt_out_date\":{$eq: null}}]}"
                            },
                            "else" : "{$and: [{\"opt_history.opt_in_date\":{$eq: %start_date%}}, {\"opt_history.opt_out_date\":{$eq: null}}]}"
                        }
                    },
                    "else" : "{$and: [{\"opt_history.opt_in_date\":{$ne: null}}, {\"opt_history.opt_out_date\":{$eq: null}}]}"
                },
                "opt_out" : {
                    "if" : {
                        "start_date" : {
                            "if" : {
                                "end_date" : "opt_history.opt_out_date:{$gte: %start_date%, $lte: %end_date%}"
                            },
                            "else" : "opt_history.opt_out_date:{$eq: %start_date%}"
                        }
                    },
                    "else" : "opt_history.opt_out_date:{$ne: null}"
                },
                "no_opt" : "{$or: [{\"opt_history\":null}, {\"opt_history.opt_out_date\":{$nin:[null]}}]}"
            }
        }
    }
}

Код, используемый для извлечения документа, выглядит следующим образом (FWIW, я пробовал как строку _id, так иObjectId и результаты совпадают):

exports.run = function(req, res, next) {
    console.log(req.query.id);
    const report = require('../models/Report');
    report.findById("5c64881002ea07789e9444aa").exec(function(err, result) {
        console.log(err);
        console.log(result);
        res.send(result);
    });
};

Я включил отладку для mongoose и вижу, что формируемый запрос - customer.findOne({ _id: ObjectId("5c64881002ea07789e9444aa") }, { projection: {} }), и я попытался запустить этот запрос в mongodbнапрямую и получите следующую ошибку.

db.customer.findOne({ _id: ObjectId("5c64881002ea07789e9444aa") }, { projection: {} })
2019-02-15T11:27:51.425-0700 E QUERY    [js] Error: error: {
    "ok" : 0,
    "errmsg" : ">1 field in obj: {}",
    "code" : 2,
    "codeName" : "BadValue"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DBCommandCursor@src/mongo/shell/query.js:708:1
DBQuery.prototype._exec@src/mongo/shell/query.js:113:28
DBQuery.prototype.hasNext@src/mongo/shell/query.js:288:5
DBCollection.prototype.findOne@src/mongo/shell/collection.js:260:10
@(shell):1:1

Кажется, проблема в «проекции: {}», которую мангуста вводит в мой запрос.Когда я уберу этот кусок, запрос будет нормально работать в mongodb.Итак, вопрос в том, почему мангуста делает это и что я могу сделать, чтобы подавить это?Мне нужен весь документ, поэтому мне не нужно проецировать поля.

1 Ответ

0 голосов
/ 16 февраля 2019

Я понял это, оказалось, что я пытался неправильно переключить dbs на моем соединении mongoose, поэтому документ, который я искал, никогда не существовал, потому что я искал в неправильном db (в то время, когда обе базы данных имели коллекцию сто же имя, но оно меняется).

...