【问题标题】:Mongoose: Find() return document with the the object that contains the valueMongoose:Find() 返回包含值的对象的文档
【发布时间】:2021-02-14 03:31:26
【问题描述】:

我正在使用 MongoDB,并表示。 我有一个包含所有国家/地区的集合,包含州和城市。

Picture of a part of the collection

现在, 假设我想获取所有包含“Los”的城市(如“San Antonio”、“San Diego”), 当我使用 Find() - 它返回包含该国所有州和所有城市的所有文档(如上图所示),

我想返回所有文档,但只返回包含值的对象,在数组“cities”内

注意:我希望不同的国家/地区的城市名称中包含部分值。

如何使用 Find() 按我的意愿返回?

她是我正在使用的架构:

const mongoose = require('mongoose');

const Schema = mongoose.Schema;
const CitiesSchema = new Schema({
    capital:{
        type: String,
        required: true
    },
    currency:{
        type: String,
        required: true
    },
    emoji: {
        type: String,
        required: true
    },
    emojiU: {
        type: String,
        required: true
    },
    id: {
        type: Number,
        required: true
    },
    iso2: {
        type: String,
        required: true
    },
    iso3: {
        type: String,
        required: true
    },
    name: {
        type: String,
        required: true
    },
    native: {
        type: String,
        required: true
    },
    phone_code: {
        type: String,
        required: true
    },
    region: {
        type: String,
        required: true
    },
    states: 
        [{
        cities:[{
            id:{
                type: Number,
                required: true
            },
            latitude:{
                type: String,
                required: true
            },
            longitude:{
                type: String,
                required: true
            },
            name:{
                type: String,
                required: true
            },

        }],
        id:{
            type: Number,
            required: true
        },
        name:{
            type: String,
            required: true
        },
        state_code:{
            type: String,
            required: true
        },
        }]
    ,
    subregion: {
        type: String,
        required: true
    }
    

});



const Cities = mongoose.model('Cities',CitiesSchema);

module.exports = Cities;

编辑:我的 Find() 代码:

Cities.find({"states.cities.name": city})
     .then((data)=>{
         return res.json(data);
     })

假设我想搜索名称为“Los Santos”的城市。我希望结果是这样的: Picture of the result I expect to be return 相反,我得到了这些国家的所有州和城市 - 这是我不想要的。

更新: 通过使用 $unwind 的聚合,我找到了一种返回数据的方法。

Cities.aggregate([{
            $unwind: '$states'
        },
        {
            $unwind: '$states.cities'
        },
        {
            $match: {
                'states.cities.name': {$regex: city, $options: "i"}
            }
        }

        ],
            function (error, data) {
                return res.json(data);
            })

【问题讨论】:

  • 能否帮助展示您当前如何使用 find() 方法?
  • 当然,我已添加到我的问题中
  • 在 .then 语句之后尝试过滤器怎么样。 Cities.find({"states.cities.name": city}) .then((data)=>{ let city = []; data[0].states.forEach(v =>{ city = cities.concat( v.cities) }); return res.json(cities); 那行得通吗?})
  • 不太清楚您希望您的数据如何...可以帮助发布当前结果和预期结果 JSON 吗?
  • 抱歉,我添加了一个更清楚的示例来说明我的期望。

标签: reactjs mongodb express mongoose mongodb-query


【解决方案1】:

我找到了一种通过 $unwind 使用聚合来返回数据的方法。

Cities.aggregate([{
        $unwind: '$states'
    },
    {
        $unwind: '$states.cities'
    },
    {
        $match: {
            'states.cities.name': {$regex: city, $options: "i"}
        }
    }

    ],
        function (error, data) {
            return res.json(data);
        })

【讨论】:

    【解决方案2】:

    尝试使用 RegEx,我在 MongoDB 上进行搜索时使用它。

    Cities.find({"states.cities.name": new RegExp(city)})
     .then((data)=>{
         return res.json(data);
     })
    

    【讨论】:

    • 感谢您的回答。此代码返回城市的整个国家,以及所有州的城市,这是我不想要的。我只是希望它像我在问题末尾添加的示例一样返回。
    猜你喜欢
    • 2019-02-08
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2020-11-13
    • 2021-05-04
    • 2017-07-15
    • 2013-10-14
    相关资源
    最近更新 更多