Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何查询与数组中对象的确切字段匹配的集合_Mongodb - Fatal编程技术网

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的答案是更好的选择。