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

时间:2015-05-07 08:01:37

标签: javascript json node.js mongodb mongoose

这是我的问题。

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

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

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

{
   _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进行比较,但还是有一种优雅方式来比较对象吗? 或者我是否必须实现我自己的解决方案,它将遍历每个子文档并手动比较属性?

1 个答案:

答案 0 :(得分:2)

由于此时我没有足够的声誉来为drinchev添加评论,我将在此处添加。首先,使用drinchev建议的toObject()方法,然后您可以使用类似https://stackoverflow.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)