Arrays Nodejs/Mongoose无法比较文档

Arrays Nodejs/Mongoose无法比较文档,arrays,node.js,mongoose,Arrays,Node.js,Mongoose,我想获取我查询的文档数组中的每个元素,并检查它是否在我查询的其他文档数组中 我有这个模型: var dataTypeSchema = new Schema({ name : String, description : String, // Personnel || Professionel || Intime category : String, provenance : { type : Schema.ObjectId,

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

我有这个模型:

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'
    }
});
我基本上是查询一个数据类型数组,然后检查每个数据类型是否在特定的dataUse.data中

我尝试了几种比较方法:includes、indexOf,甚至比较每个元素\u id,它总是返回false

我已经检查了这两个数组是否确实包含文档,以及它们是否有一些共同的文档

这是我的代码(一次尝试)用于比较,我首先得到一个DataUse数组,然后为每个DataUse检查它与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)
const dataTypesArray=wait Service.getServiceDataTypes(req.params.serviceName)
查找({service:serviceID,user:serviceID})
.populate('目的数据类型服务用户')
.exec()
。然后(数据使用=>{
for(设j=0;j
对于最后一个
if(条件)
,所有值都设置为-1 两个
数据类型
数组都已填充,但正如我所说的,我尝试只比较id,结果仍然相同


谢谢

以下是您如何做到这一点

将一个数组与其他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(条件)

按如下方式更改此代码块:

.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;
})
。然后(数据使用=>{
//假设它是一个ObjectID数组
dataTypesIDsArray=dataTypesIDs.map(i=>i.toString())
for(设j=0;ji.toString())
for(设k=0;k

它没有经过测试,但我引用了我的项目中现有的测试代码。

我改进了你的代码,并发布了答案。@MuhammadFaizan非常感谢改进,你知道比较的问题来自哪里吗?在javascript中,你不能比较像
{}==={}这样的对象//false
@Alexandroolaru那么你怎么能比较它们呢?我试过比较这些ID,但都不起作用。谢谢。这很有帮助,我现在明白了,我确信它会起作用,马上测试它