Nodejs / Mongoose无法比较文档

时间:2018-03-29 11:58:22

标签: arrays node.js mongoose

我想获取我查询的文档数组中的每个元素,并检查它是否在我查询的其他文档数组中

我有这个型号:

var dataTypeSchema = new Schema({

    name : String,
    description : String, 
    // Personnel || Professionel || Intime
    category : String,

    provenance : {
        type : Schema.ObjectId, 
        ref : 'Service'
    }

});

和这一个:

var dataUseSchema = new Schema({
    purpose : {
        type : Schema.ObjectId, 
        ref : 'Purposes'
    },

    dataTypes : [{
        type : Schema.ObjectId, 
        ref : 'DataType'
    }],
    description : String,
    service : {
        type : Schema.ObjectId, 
        ref : 'Service'
    },
    user : {
        type : Schema.ObjectId, 
        ref : 'User'
    }
});

我基本上查询一个dataTypes数组,然后想检查每个数据类型是否在特定的dataUse.data中

我尝试了几种比较方法:include,indexOf,甚至比较每个元素_ids,它总是返回false

我已经检查过两个数组确实包含文档,并且它们有一些共同的文档

这是我的代码(一次尝试)进行比较,我首先得到一个DataUses数组,然后为每一个我想检查它与dataTypesArray共享的值

const dataTypesArray = await Service.getServiceDataTypes(req.params.serviceName)


DataUse.find({service : serviceID, user : serviceID})
.populate('purpose dataTypes service user')
.exec()
.then(dataUses => {
    for(let j = 0; j < dataUses.length; j++) {
        for(let k = 0; k < dataTypesIDs.length; k++) {
            if(dataUses[j].dataTypes.indexOf(dataTypesIDs[k])==-1) {
                dataUses[j]["otherData"].push(dataTypesIDs[k])
            }
        }

    }
    return dataUseArray
})
.catch(console.log)

对于最后一个if (condition),所有设置都等于-1 两个dataTypes数组都已填充,但正如我所说,我尝试只比较 _id 并且仍然是相同的结果

谢谢!

1 个答案:

答案 0 :(得分:2)

以下是如何做到这一点......

将数组与其他Mongoose数组进行比较。 查看您获得的ID是mongoose ObjectID,这是对象

ObjectID 数组与其他 ObjectID 进行比较:

// converting dataTypes to String, 
// you can also convert it by using `lean`
// i.e  Model.find().lean().exec() 
// this would return JavascriptObject instead of MongooseModel

dataTypeIDs = dataTypes.map(i => i.toString()); // converting to plain 
// Array of string
dataTypeIDs.indexOf(someDataTypeID.toString()); // returns -1 if not found

您可以在if (condition)

中使用最后一行将其转换为您喜欢的内容

更改此代码块:

.then(dataUses => {
    // assuming its an Array of ObjectID
    dataTypesIDsArray = dataTypesIDs.map(i => i.toString())
    for(let j = 0; j < dataUses.length; j++) {
        usesDataTypes = dataUses[j].dataTypes.map(i => i.toString()) 
        for(let k = 0; k < dataTypesIDsArray.length; k++) {
            if(usesDataTypes.indexOf(dataTypesIDsArray[k]) == -1) {
                dataUses[j]["otherData"].push(dataTypesIDsArray[k])
                // use ObjectID from mongoDB if you want to cast it to "ObjectId"
            }
        }
    }
    return dataUseArray;
})

它没有经过测试,但我已经参考了我项目中现有的测试代码。