Mongodb 如何查询与数组中对象的确切字段匹配的集合
如何查询与数组中对象的确切字段匹配的集合 因为测试用例更明确,所以这里是要通过的测试Mongodb 如何查询与数组中对象的确切字段匹配的集合,mongodb,Mongodb,如何查询与数组中对象的确切字段匹配的集合 因为测试用例更明确,所以这里是要通过的测试 a=Invitation.create(来宾:[Guest.new(player:'bbb')、Guest.new(player:'ccc')) b=邀请。创建(来宾:[来宾.新建(玩家:“ccc”)、来宾.新建(玩家:“bbb”)]) c=邀请。创建(来宾:[来宾。新建(玩家:“bbb”)、来宾。新建(玩家:“ccc”)、来宾。新建(玩家:“ddd”)) #请求查找以bbb和ccc作为客人玩家id的邀请,无论
a=Invitation.create(来宾:[Guest.new(player:'bbb')、Guest.new(player:'ccc'))
b=邀请。创建(来宾:[来宾.新建(玩家:“ccc”)、来宾.新建(玩家:“bbb”)])
c=邀请。创建(来宾:[来宾。新建(玩家:“bbb”)、来宾。新建(玩家:“ccc”)、来宾。新建(玩家:“ddd”))
#请求查找以bbb和ccc作为客人玩家id的邀请,无论顺序如何。
结果=邀请。集合。查找(…)
断言结果相等[a,b]
我的用例是一个邀请系统,其中不能存在相同的来宾组合,因此当发送新的邀请时,我需要检查其中是否有完全相同的来宾(无论他们的顺序如何)
注意:我使用来宾对象数组,因为它携带一些额外的数据。下面是一个示例数据集() 也许这就是你需要的。我不确定您使用的是哪种ORM或哪种模式,但这里有一个mongo shell输出示例:
> db.invitation.find({'guests.player':{'$all':['bbb','ccc']}})
{ "_id" : ObjectId("518319079468428b381d3563"), "guests" : [ { "player" : "bbb" }, { "player" : "ccc" } ] }
{ "_id" : ObjectId("518319239468428b381d3566"), "guests" : [ { "player" : "ccc" }, { "player" : "bbb" } ] }
{ "_id" : ObjectId("518319b39468428b381d3567"), "guests" : [ { "player" : "ccc" }, { "player" : "bbb" }, { "player" : "ddd" } ] }
如果您只想要那些只包含'bbb'
和'ccc'
的,您可以尝试以下操作:
db.inv.find({'guests.player':{$all:['bbb','ccc']},
'guests':{$not:{$elemMatch:{'player':{$nin:['bbb','ccc']}}}}})
其中:
[
{ "_id" : ObjectId("518319079468428b381d3563"),
"guests" : [ { "player" : "bbb" }, { "player" : "ccc" } ] },
{ "_id" : ObjectId("518319239468428b381d3566"),
"guests" : [ { "player" : "ccc" }, { "player" : "bbb" } ] }
]
如果您想要
'bbb'
和'ccc'
,只需将$all
替换为$in
。这在某种程度上是一个XOR实现,但我不确定它是否涵盖了您的所有用例。基于nyde1319的回答;这感觉有点像黑客,但由于还没有其他答案,这里是:
db.invitation.find({'guests.player':{'$all':['bbb','ccc']}, guests: {$size: 2}})
{$size:2}
中的数字2当然取决于数组的长度。能否提供一个来自mongo的记录示例?db.Invitation.findOne()就可以了。我编辑了这篇文章,添加了一个示例数据集()。问题是我不想要第三条记录。我只想邀请确切的球员BBB和CCC(无论顺序)。我不要含有BBB、CCC和DDD的。谢谢。我相信Juho的答案是更好的选择。