我正在尝试做一些应该很简单的事情。凝结管道使您可以按顺序通过文档。例如,我可以过滤一些文档,并将我想要的文档传递到下一阶段。这可以通过$匹配来完成。然后,我想将剩余的文档放在字段中,以检查重复项。但是我有重大问题。这就是我尝试的:
db.my_fields.aggregate(
{ '$match' : { related_code_id: { "$in" : [ BSON::ObjectId('5cddd0143ed1495e5c000008'),BSON::ObjectId('5cddd0143ed1495e5c000010')] } } },
{ '$group' : { _id: { 'field' : '$field', 'field_type_id' : '$field_type_id' }, count: { '$sum' : 1} } },
{'$match' : { count: {'$gt' : 1} } }
)
除了第一个$匹配,查询工作正常。在语句中的$中,我会遇到此错误:
2019-05-17T18:47:56.602-0400 E QUERY [js] SyntaxError: missing ] after element list @(shell):2:95
它在这里抱怨这部分:
BSON::ObjectId('5cddd0143ed1495e5c000008'),BSON::ObjectId('5cddd0143ed1495e5c000010')
如何解决此问题并实现我的基本查询工作的目标?
不需要将objectid转换为bson:
https://docs.mongodb.com/manual/reference/method/db.collection.find/#query-using-operators
// ...
'$match': {
related_code_id: {
"$in": [
ObjectId('5cddd0143ed1495e5c000008'),
ObjectId('5cddd0143ed1495e5c000010')
]
}
}
// ...
如果您使用的是mongoose as Orm,则可以如下解决。
db.my_fields.aggregate(
{ '$match' : { related_code_id: { "$in" : [ mongoose.Types.ObjectId('5cddd0143ed1495e5c000008'),mongoose.Types.ObjectId('5cddd0143ed14 95e5c000010')] } } },
{ '$group' : { _id: { 'field' : '$field', 'field_type_id' : '$field_type_id' }, count:
{ '$sum' : 1} } },
{'$match' : { count: {'$gt' : 1} } }
)