比较MongoDb中的两个字段

时间:2019-03-18 15:39:10

标签: mongodb mongodb-query

我是MongoDB的新手,正在尝试比较MongoDB集合中的2个字段。

字段是属性(对象)和集合(数组)

{ 
    "_id" : ObjectId("55ae1e47309ffcbd1b67bd6c"), 
    "collections" : [
        {
            "collection_code" : "9TEST", 
            "_id" : ObjectId("5c76eee4bb4afe3a3603eeb3")
        }
    ], 
   "attributes" : {
        "collection_code" : "9TEST"
    }
}

我的查询是

db.companies.find({ $where : "this.attributes.collection_code == this.collections[collection_code]" })

遇到错误

{
    "message" : "TypeError: Cannot read property 'collection_code' of undefined" +
              "at _funcs1 (_funcs1:1:45) near 'on_code == this.collections[collection_co' ",
    "$err" : "TypeError: Cannot read property 'collection_code' of undefined" +
              "at _funcs1 (_funcs1:1:45) near 'on_code == this.collections[collection_co' ",
    "code" : 16722,
    "name" : "MongoError"
}

我们非常感谢您的帮助。预先感谢。

1 个答案:

答案 0 :(得分:1)

您需要一个$expr来比较MongoDB中的两个字段。由于您有一个数组(collection,并且要检查是否存在字段匹配的任何元素,因此可以将$map$anyElementTrue运算符一起使用,如下所示:

db.col.find({
    $expr: {
        $anyElementTrue: {
            $map: {
                input: "$collections",
                in: {
                    $eq: [ "$$this.collection_code", "$attributes.collection_code" ]
                }
            }
        }
    }
})

使用$in运算符还有更简洁的方式

db.col.find({
    $expr: {
        $in: [ "$attributes.collection_code", "$collections.collection_code" ]
    }
})

之所以有效,是因为collections.collection_code在这种情况下代表字符串数组。

编辑: 作为3.0版本的解决方法,您可以将$anyElementTrue$redact结合使用:

db.col.aggregate([
    { $redact: {
        $cond: {
        if: {$anyElementTrue: { $map: { input: "$collections", as: "c", in: { $eq: [ "$$c.collection_code", "$attributes.collection_code" ]  }  }}},
        then: "$$KEEP",
        else: "$$PRUNE"
        }
    }
    }
])