如何在mongoose引用模式中使用$in

5

我有两个模式,第一个是城市,第二个是邮编。邮编引用了城市。它们的样子是这样的:

城市模式

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;

Pincode schemas

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

“findById” 仅接受 id 字符串而不是对象。如何获取“pincodes”值?它是需要 pincode 模式的值吗? - hassansin
1个回答

12

$in 运算符不仅仅是用于查询数组,因为可以使用基本上任何针对单个值的运算符进行查询。

实际上,它是一个“参数列表”,其求值结果为 $or 条件,但具有更短的语法

   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
      }
 )

您之所以会遇到错误,是因为您正在用一个“字符串”覆盖“数组”定义,这也是除非另有解析,否则所有“请求”对象都是如此。
另一个错误的原因是您调用了错误的方法。.findById()期望文档的_id作为单个参数。要查询其他字段,请使用.findOne()或在这种情况下使用.find(),因为$in可能匹配多个文档。

嘿,我添加了 console.log(req.body); 输出,请帮我看看我做错了什么。 - Dexter
@Sanji,我在你的问题中没有看到req.body的内容。我已经告诉过你了。1. 你有一个单一的字符串而不是一个数组。2. 你正在使用错误的参数调用方法。按照答案中所示的方式操作。 - Blakes Seven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接