我有一个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,并且必须使用聚合管道。
答案 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
属性匹配。