如何在 mongoose 参考模式中使用 $in
How to use $in in mongoose reference schema
我有 2 个模式,第一个是城市,第二个是密码。具有城市参考的密码。他们看起来都像这样
CITY 架构
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// create a all city list
var allCitySchema = new Schema({
cities: {
type: String
}
}, {collection: 'allcities'});
var allcities = mongoose.model('allcities', allCitySchema);
module.exports = allcities;
密码模式
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var allPincode = new Schema({
city_id: {
type: Schema.ObjectId,
ref: 'allcities'
},
pincode: {
type: String
}
}, {collection: 'pincode'});
var allPincode = mongoose.model('pincode', allPincode);
module.exports = allPincode;
现在的问题是,当我尝试根据城市 ID 获取所有密码时,我尝试这样做
app.post('/api/getPincodeByCity', function(req, res) {
console.log("In pincode");
var cities_id = [];
cities_id = req.body.cities_id;
console.log(req.body); // { cities_id: '["5597aa08c0a0beb40be128d4","5597aa2bbb18fefc142b6915"]' }
console.log(cities_id);
pincodes.findById( {city_id: { $in: cities_id }}, function(err,pincodeIds){
if(err) res.send(err.message);
res.send(pincodeIds);
res.end('{"success" : "Recieved Successfully", "status" : 200}');
});
});
但它没有工作,它给我这个错误
Cast to ObjectId failed for value "[object Object]" at path "_id"
我也尝试使用 find()
而不是 findById()
方法,但它给了我这个错误
undefined is not a function
$in
运算符不仅 "strictly" 用于查询数组,因为基本上任何运算符都可以查询奇异值。
它实际上是一个 "list of arguments" 计算结果为 $or
condition, but with shorter syntax:
var idList = ["559e0dbd045ac712fa1f19fa","559e0dbe045ac712fa1f19fb"];
var pincode = mongoose.model('pincode');
pincode.find({ "city_id": { "$in": idList } },function(err,docs) {
// do something here
});
如前所述,这是缩写形式:
pincode.find(
{
"$or": [
{ "city_id": "559e0dbd045ac712fa1f19fa" },
{ "city_id": "559e0dbe045ac712fa1f19fb" }
]
},
function(err,docs) {
// do something here
}
)
您收到一个错误,因为您正在用 "string" 覆盖 "array" 定义,除非以其他方式解析,否则所有 "request" 对象都是如此。
错误的另一个原因是您调用了错误的方法。 .findById()
需要文档的 _id
的单个参数。要查询其他字段,请使用 .findOne()
或在本例中为 .find()
,因为 $in
可能会匹配多个文档。
我有 2 个模式,第一个是城市,第二个是密码。具有城市参考的密码。他们看起来都像这样
CITY 架构
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// create a all city list
var allCitySchema = new Schema({
cities: {
type: String
}
}, {collection: 'allcities'});
var allcities = mongoose.model('allcities', allCitySchema);
module.exports = allcities;
密码模式
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var allPincode = new Schema({
city_id: {
type: Schema.ObjectId,
ref: 'allcities'
},
pincode: {
type: String
}
}, {collection: 'pincode'});
var allPincode = mongoose.model('pincode', allPincode);
module.exports = allPincode;
现在的问题是,当我尝试根据城市 ID 获取所有密码时,我尝试这样做
app.post('/api/getPincodeByCity', function(req, res) {
console.log("In pincode");
var cities_id = [];
cities_id = req.body.cities_id;
console.log(req.body); // { cities_id: '["5597aa08c0a0beb40be128d4","5597aa2bbb18fefc142b6915"]' }
console.log(cities_id);
pincodes.findById( {city_id: { $in: cities_id }}, function(err,pincodeIds){
if(err) res.send(err.message);
res.send(pincodeIds);
res.end('{"success" : "Recieved Successfully", "status" : 200}');
});
});
但它没有工作,它给我这个错误
Cast to ObjectId failed for value "[object Object]" at path "_id"
我也尝试使用 find()
而不是 findById()
方法,但它给了我这个错误
undefined is not a function
$in
运算符不仅 "strictly" 用于查询数组,因为基本上任何运算符都可以查询奇异值。
它实际上是一个 "list of arguments" 计算结果为 $or
condition, but with shorter syntax:
var idList = ["559e0dbd045ac712fa1f19fa","559e0dbe045ac712fa1f19fb"];
var pincode = mongoose.model('pincode');
pincode.find({ "city_id": { "$in": idList } },function(err,docs) {
// do something here
});
如前所述,这是缩写形式:
pincode.find(
{
"$or": [
{ "city_id": "559e0dbd045ac712fa1f19fa" },
{ "city_id": "559e0dbe045ac712fa1f19fb" }
]
},
function(err,docs) {
// do something here
}
)
您收到一个错误,因为您正在用 "string" 覆盖 "array" 定义,除非以其他方式解析,否则所有 "request" 对象都是如此。
错误的另一个原因是您调用了错误的方法。 .findById()
需要文档的 _id
的单个参数。要查询其他字段,请使用 .findOne()
或在本例中为 .find()
,因为 $in
可能会匹配多个文档。