我在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
}
})
});
})
感谢任何帮助
答案 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;
}
})
}