我想获取我查询的文档数组中的每个元素,并检查它是否在我查询的其他文档数组中
我有这个型号:
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 并且仍然是相同的结果
谢谢!
答案 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;
})
它没有经过测试,但我已经参考了我项目中现有的测试代码。