将数组中的属性与Document中的单个属性进行比较

时间:2017-09-07 05:01:23

标签: mongodb mongodb-query aggregation-framework

我有一个mongoDB orders集合,其文档如下所示:

[{
    "_id" : ObjectId("59537df80ab10c0001ba8767"),
    "shipments" : {
        "products" : [
            {
                "orderDetails" : {
                    "id" : ObjectId("59537df80ab10c0001ba8767")
                }
            },
            {
                "orderDetails" : {
                    "id" : ObjectId("59537df80ab10c0001ba8767")
                }
            }
        ]
    },
}
{
    "_id" : ObjectId("5953831367ae0c0001bc87e1"),
    "shipments" : {
        "products" : [
            {
                "orderDetails" : {
                    "id" : ObjectId("5953831367ae0c0001bc87e1")
                }
            }
        ]
    },
}]

现在,从这个集合中,我想过滤出shipments.products.orderDetails.id路径中的任何值与_id路径上的值相同的元素。

我试过了:

db.orders.aggregate([{
    "$addFields": {
        "same": {
            "$eq": ["$shipments.products.orderDetails.id", "$_id"]
        }
    }
}])

添加字段same作为标志来确定值是否相等,但same的值对于所有文档都是false

修改 我想要做的是将文档的_id字段与数组中的所有shipments.products.orderDetails.id值进行比较。 如果shipments.products.orderDetails.id中的1个匹配_id字段的值,我希望该文档出现在最终结果中。

PS 我正在使用MongoDB 3.4,并且必须使用聚合管道。

1 个答案:

答案 0 :(得分:1)

您当前的尝试失败,因为符号返回"数组"与单个值"相比较。

所以要么在可用的情况下使用$in,可以比较一下是否有一个值"在"一个数组:

db.orders.aggregate([
  { "$addFields": {
    "same": {
      "$in": [ "$_id", "$shipments.products.orderDetails.id" ]  
    }  
  }}
])

或者使用$setIsSubset

将两者都标记为数组
db.orders.aggregate([
  { "$addFields": {
    "same": {
      "$setIsSubset": [ "$shipments.products.orderDetails.id", ["$_id"] ]  
    }  
  }}
])

在这种情况下,它会进行比较以确定"设置"有一个"十字路口"这使_id成为"子集"值数组。

任何一种情况都会在"任何"时返回true指定路径的数组条目中的id属性与文档的_id属性匹配。