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,但都不起作用。谢谢。这很有帮助,我现在明白了,我确信它会起作用,马上测试它