【问题标题】:Nodejs/Mongoose fail to compare documentsNodejs/Mongoose 无法比较文档
【发布时间】:2018-09-08 08:59:27
【问题描述】:

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

我有这个模型:

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,甚至比较每个元素_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 并且结果仍然相同

谢谢!

【问题讨论】:

  • 我已经改进了你的代码,也发布了答案。
  • @MuhammadFaizan 非常感谢改进,你知道比较的问题来自哪里吗?
  • 在javascript中你不能比较像{} === {} // false这样的对象
  • @AlexandruOlaru 那么你怎么能比较它们呢?我试过只是比较_ids,也不起作用

标签: arrays node.js mongoose


【解决方案1】:

你可以这样做...

将一个数组与其他 Mongoose 数组进行比较。 查看您获得的 ID 是 mongoose ObjectID 这是一个 object

要将 ObjectIDArray 与其他 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;
})

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

【讨论】:

  • 非常感谢,这对我很有帮助,我现在明白了,我相信它会起作用,马上测试它
猜你喜欢
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2017-08-15
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多