【问题标题】:Push data in nested arrays nodeJs, MongoDB在嵌套数组 nodeJs、MongoDB 中推送数据
【发布时间】:2018-09-26 22:32:12
【问题描述】:

我有类似的文档,

{
    "_id" : ObjectId("5ab4cc12c773133bae3d8dc9"),
    "__v" : 19.0,
    "geoGraphicalFilter" : {
        "aCountries" : [
            {
                "country" : "Spain",
                "_id" : ObjectId("5ad49ab21210c42aa6ccba23"),
                "cities" : [ ]
            },
            {
                "country" : "India",
                "_id" : ObjectId("5ad49ab21210c42aa6ccba24"),
                "cities" : [ ]
            }
        ]
    }
}

型号

const HuntingWindow = new Schema({
  geoGraphicalFilter: {
    aCountries: [
      {
        country: String,
        cities: { type: Array }
      }
    ]
  },
});

片段

const addCityFilter = (req, res) => {
  if (req.body.aCities === "") {
    res.status(409).jsonp({ message: adminMessages.err_fill_val_properly });
    return false;
  } else {
    var Cities = req.body.aCities.split(",");
    huntingModel.update({ _id: req.body.id,"data.geoGraphicalFilter.aCountries":req.body.sName },
    {$push:{"geoGraphicalFilter.0.aCountries.$.cities":Cities}},
    (error, data) => {       
        // Cities.forEach(element => {
        //   data.geoGraphicalFilter.aCountries.find(req.body.sName)
        // });
      data.save((error, success) => {
        res.status(200).jsonp({
          message: adminMessages.succ_countryFilter_added
        });
      });
    });
  }
};

现在我想首先通过根 id 查找文档,然后我想匹配 country name 并将 cities 插入数组中。我是 MongoDB 和 nodejs 的新手,我该怎么做?虽然我正在尝试更新查询,但我做错了,请帮助我。

【问题讨论】:

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


    【解决方案1】:

    试试下面的代码:

    huntingModel.update(
        { _id: ObjectId("5ab4cc12c773133bae3d8dc9"), "geoGraphicalFilter.aCountries.country": "Spain"  },
        { $addToSet: { "geoGraphicalFilter.aCountries.$.cities": { $each: [ "city1", "city2" ] } } }
    )
    

    您应该指定两个过滤条件:一个用于整个文档,一个用于匹配数组元素。然后您可以使用$ 运算符更新该数组中的第一个匹配文档。要推送多个值,您可以使用 $each 运算符。为确保没有重复,您应该使用$addToSet

    【讨论】:

    • 但在第二次添加时不应接受重复值
    • @NikhilSavaliya 你需要$addToSet 而不是推送。修改了我的答案
    • 仍然有一个疑问,如果"geoGraphicalFilter.aCountries.country": "Spain" 不存在,位置操作符到时候会抛出错误
    • 是的,没错。因此,您必须处理该错误并可能推动整个国家。更多信息:stackoverflow.com/questions/8871363/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2018-05-10
    相关资源
    最近更新 更多