我有一个以副本集配置运行的分片transactions
集合。
我正在尝试汇总特定用户的最新交易列表。该架构本质上是{sender: ObjectId(..), recipient: ObjectId(..), createdAt: .., shardKey: ..}
。 shardKey是按字母顺序sender
+ recipient
排序的,因此无论交易方向如何,它都是相同的。
我看到一种行为,其中aggregate
和$or
似乎在两个$or
准则中的第一个准则上急切匹配。
示例:
有两条记录:
记录1-{sender: a, recipient: b, createdAt: 2018-09-21}
记录2-{sender: b, recipient: a, createdAt: 2018-09-22}
运行以下查询:
db.transactions.aggregate([ { '$match': { '$or': [ { recipient: ObjectId(a) }, { sender: ObjectId(a) } ] } }, { '$project': ... }, { '$group': { sender: { '$last': '$sender' }, recipient: { '$last': '$recipient' } } }, { '$sort': { createdAt: -1 } }], {})
即使记录1是更新的,也将返回记录2。
将查询调整为仅由发件人查询
db.transactions.aggregate([ { '$match': { '$or': [ { sender: ObjectId(a..) } ] } }, { '$project': ... }, { '$group': { sender: { '$last': '$sender' }, recipient: { '$last': '$recipient' } } }, { '$sort': { createdAt: -1 } }], {})
将返回记录1。
任何获得此$或执行更像传统SQL OR的方法吗?