如何将 Mongoose 对象与 JSON 对象进行比较?

Posted

技术标签:

【中文标题】如何将 Mongoose 对象与 JSON 对象进行比较?【英文标题】:How to compare a Mongoose object to a JSON object? 【发布时间】:2015-07-17 16:16:45 【问题描述】:

这是我的问题。

一方面,我有一个 Mongoose 对象的普通对象表示。

另一方面,我有一个 Mongoose 对象直接来自数据库中的 findOne

我要做的是检查两个对象的两个属性之间是否有任何不同。 让我们以这种模型为例:


   _id: 'abc',
   id: 'abc',
   things: [
      _id: 'def',
      id: 'def',
      other_things: [
        _id: 'ghi',
        id: 'ghi',
        foo: 'bar'
      ]
   ]

我想比较 myplainobject.thingsmydbobject.things

但是,使用underscore_.isEqual(myplainobject.things, mydbobject.things) 总是失败。

这是由于第一种情况下为string 和另一种情况下为ObjectID 的ID。

虽然有很多方法可以将ObjectIDstring 进行比较,但有没有一种优雅 的方法来比较对象? 还是我必须实现自己的解决方案,循环遍历每个子文档并手动比较属性?

【问题讨论】:

尝试在查询中使用精益:***.com/questions/9952649/… 这不是一个选项,我需要save方法 【参考方案1】:

由于此时我没有足够的声誉来为 drinchev 的答案添加评论,因此我将在此处添加。首先,使用 drinchev 建议的toObject() 方法,然后您可以使用类似于https://***.com/a/14368628/3365039 的答案(稍作修改)来确保键的顺序相同。

function compareKeys(a, b) 
    var aKeys = Object.keys(a).sort();
    var bKeys = Object.keys(b).sort();

    // Check that the objects contain the same keys.
    if (JSON.stringify(aKeys) !== JSON.stringify(bKeys)) 
        return false
    

    // Check that the keys in each object contain the same values.
    for (const key in aKeys) 
        if (a[key] !== b[key]) 
            return false
        
    

    return true


compareKeys(mongooseModel.toObject(), jsObject)

【讨论】:

以上是关于如何将 Mongoose 对象与 JSON 对象进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Mongoose 文档转换为普通对象?

如何将 Mongoose 文档转换为普通对象?

如何将 Mongoose 文档转换为普通对象?

Node.js / Express / Mongoose - 如何发送 JSON 以及对象视图?

与 nodejs、mongoose 和 JSON 对象数组拼接

如何将 promise 对象中返回的 JSON 对象分配给全局变量?