根据Mongoose结果更新JSON变量

时间:2018-02-08 02:26:51

标签: json node.js mongodb

我在mongoDB集合之外有一个JSON变量,如下所示

        var outputJson = [
            {
                'Product' : 'TV',
                'isSelected': 0
            },
            {
                'Product' : 'Radio',
                'isSelected': 0
            },
            {
                'Product' : 'Book',
                'isSelected': 0
            },                      
            {
                'Product' : 'Watch',
                'isSelected': 0
            }                 
        ]

现在我想更新isSelected密钥,如果产品退出MongoDB;我想要下面的东西

        var outputJson = [
            {
                'Product' : 'TV',
                'isSelected': 0
            },
            {
                'Product' : 'Radio',
                'isSelected': 1
            },
            {
                'Product' : 'Book',
                'isSelected': 0
            },                      
            {
                'Product' : 'Watch',
                'isSelected': 1
            }                 
        ]

以下是我正在尝试的代码,但我没有得到上述结果

outputJson.forEach(function(key,value){
 wishlistData.find({userID:req.user.id}, function(err,data{
  data.forEach(function(k,i){
    if (data[i].product=== outputJson[value].Product){
      outputJson[value].isSelected = 1
     }
   })
 }); 
})

感谢任何帮助

4 个答案:

答案 0 :(得分:1)

首先,调用data[i]的回调函数,将数组中的项作为第一个参数,因此outputJson[value]findOne是多余的。

您应该使用mongoose的Product方法查看是否至少有一个匹配项,并且您可以按以下方式传入outputJson.forEach(function(item) { wishlistData.findOne({userID: req.user.id, product: item.Product}, function(err, data) { if (data !== null) { // if it actually found a match item.isSelected = 1; } }); });

outputJson

但请记住,mongoDB查询是异步的,因此在forEach循环之后Promise.all仍然是相同的。您可能希望使用promises和Promise.all(outputJson.map(function(item) { return wishlistData.findOne({userID: req.user.id, product: item.Product}).then(function(err, data) { if (data !== null) { // if it actually found a match item.isSelected = 1; } }); })).then(function() { // do stuff with outputJson here }); 来确保在处理完所有查询后使用outputJson执行操作:

indexOf

答案 1 :(得分:0)

替换此

if (data[i].product=== outputJson[value].Product){
      outputJson[value].isSelected = 1
     }

通过

if (data[k].product=== outputJson[key].Product){
      outputJson[key].isSelected = 1
     }

每个回调函数都将第一个参数作为索引

答案 2 :(得分:0)

谢谢你@Ambyjkl,你指导工作Promise诀窍,我对你的脚本做了一些小改动,它开始工作

Promise.all(outputJson.map(function(i,k) {
  return wishlistData.findOne({userID: req.user.id, product: i.Product}).then(function(data, err) {
    if (data !== null) { // if it actually found a match
      i.isSelected = 1;
    }
  });
})).then(function() {
    console.log(outputJson);
});

答案 3 :(得分:0)

首先,为什么你要对Array中的每个对象重复执行相同的mongo查询,因为它会给你相同的结果。还可以使用lodash库' lodash'。这就是你如何做到这一点:

var _ = require('lodash')
wishlistData.find({userID:req.user.id}, function (err, data) {
    var dataMap = _.indexBy(data, "product");
    outputJson.forEach(function(key,value){
        if(!_.isEmpty(_.get(dataMap, key.Product))) {
            key.isSelected = 1;
        }
    })
}