使用Underscore通过ObjectId过滤mongodb对象结果

时间:2013-09-09 15:11:40

标签: javascript node.js mongodb mongoose underscore.js

我在NodeJS中组合UnderscoreJS和MongooseJS时遇到问题。我有mongoose的结果,我想过滤一个数组

var __ = require("underscore"),
    platformInfo = __.findWhere(user.platforms, {"pId": platformId});

但是user.platforms中的pId是一个ObjectId,无法找到。 但是,如果我制作一个并且比较这样就可以了:

__.each(user.platforms, function(platform){

                if(platform.pId.toString() == platformId){

                }

});

我如何在findWhere方法(一行,酷)中找到相同的结果?感谢

4 个答案:

答案 0 :(得分:6)

遗憾的是,mongodb ObjectId实例无法与JavaScript的相等运算符=====一起正常运行。您需要使用提供的方法:objectId1.equals(objectId2)或确保它们都转换为字符串然后下划线或===将起作用。

platformInfo = _.filter(user.platforms, function (platform) {
  return platform.pId.toString() === platformId;
})

答案 1 :(得分:0)

我尝试使用underscore.js编写该问题的一般函数:

function findWhereObjectId(objs, comp) {
    return _.find(objs, function(obj) {
        return _.some(_.keys(obj), function(key) {
            return (key == _.keys(comp)[0] && obj[key].equals(comp[key]));
        });
    });
};

您现在可以致电findWhereObjectId(user.platforms, {"pId": platformId}),它应该会给您第一场比赛。

答案 2 :(得分:0)

如前所述,mongodb ObjectId实例无法与JavaScript的相等运算符一起正常工作。 但是,对于这个问题还有另一个更简单的解决方案:您可以获取MongoDB结果对象并通过JSON.stringify()将其转换为字符串:

    var myString = JSON.stringify(MONGODB_RESULT);

之后,您可以通过JSON.parse()将该字符串转换回对象:

    var myObject = JSON.parse(myString);

您现在可以对该对象执行任何Lodash / Underscore操作。

希望有所帮助!

答案 3 :(得分:0)

您可以在mongo响应对象的id之后使用.toString 对于前

valorParcela:number; totalCost:number; VendaProdutoVendaNParcelas: number; this.valorParcela = Number( this.totalCost / this.VendaProdutoVendaNParcelas).toFixed(2);