0
编辑评论

我数据库中有一条记录如下:
{“_id”: ObjectId(“62319790d144000042005e43”), “asd”: [{“qwe”: [“1”, “2”]}, {“qwe”: [“3”, “2”]}]}
我预期查询结果,如下:
{“asd”: [{“qwe”: [“3”, “2”]}]}
因为在应用到实际当中,并不知道数组中的元素个数和顺序,所以查询语句如下:
db.test.find({“asd.qwe”: {“$all”: [“3”, “2”]}}, {“_id”: 0, “asd.qwe.$”: 1})
查询到的结果,如下:
{“asd”: [{“qwe”: [“1”, “2”]}]}

你语法用错,$all表示数组中包括的意思,不是完全匹配。这样的整个asd就满足了,然后$投影操作返回第一个成员就是【1,2】,去掉$all就可以了。
mongos> db.xiaobao.find()
{ “_id” : ObjectId(“623bea135916277e056d171e”), “asd” : [ { “qwe” : [ 1, 2 ] }, { “qwe” : [ 3, 2 ] } ] }
{ “_id” : ObjectId(“623beabe5916277e056d171f”), “asd” : [ { “qwe” : [ 1, 2 ] }, { “qwe” : [ 2, 3 ] }, { “qwe” : [ 3, 2 ] } ] }
mongos> db.xiaobao.find({“asd.qwe”:[ 3,2 ]},{_id:0,”asd.qwe.$”:1})
{ “asd” : [ { “qwe” : [ 3, 2 ] } ] }
{ “asd” : [ { “qwe” : [ 3, 2 ] } ] }
mongos>

首先非常感谢你的解答,但是因为在实际过程中,并不知道数据库中数组的元素个数和顺序,而且查询条件的数据中的元素个数和顺序也是未知的,这样该怎么写查询语句呢?如果不用$all的话,就是完全匹配了,我必须要知道数据库中的数组元素个数和排列顺序,然后再写查询语句,感觉有点本末倒置了。我原本是打算用$all和$size来查询,但是也不行。我不知道该如何写查询语句了

明白了,通过$elemMatch来实现
mongos> db.xiaobao.find();
{ “_id” : ObjectId(“623bea135916277e056d171e”), “asd” : [ { “qwe” : [ 1, 2 ] }, { “qwe” : [ 3, 2 ] } ] }
{ “_id” : ObjectId(“623beabe5916277e056d171f”), “asd” : [ { “qwe” : [ 1, 2 ] }, { “qwe” : [ 2, 3 ] }, { “qwe” : [ 3, 2 ] } ] }
{ “_id” : ObjectId(“623bfd065916277e056d1720”), “asd” : [ { “qwe” : [ 2, 3, 4 ] }, { “qwe” : [ 3, 2 ] } ] }
mongos> db.xiaobao.find({“asd.qwe”:{$all:[ 3,2 ]}},{_id:0,”asd”:{$elemMatch:{qwe:{$all:[3,2]}}}})
{ “asd” : [ { “qwe” : [ 3, 2 ] } ] }
{ “asd” : [ { “qwe” : [ 2, 3 ] } ] }
{ “asd” : [ { “qwe” : [ 2, 3, 4 ] } ] }
mongos>

非常感谢你的解答,$elemMatch确实可以实现。