MongoDB查询检查数组属性中是否存在某个值

6

我不知道如何检查Mongo文档中的数组属性中是否存在某个值。 例如,我有一个名为“users”的集合,以及这样的文档:

{
  'name':'Paul',
  'age':43,
  'friendsIDs': [ ObjectId('qqq...'), ObjectId('www...'), ObjectId('eee...') ],
}

现在假设我想检查ID为ObjectId('qqq...')的用户是否是Paul的朋友。 在几乎所有编程语言中都很容易实现,例如在php中可以这样写:
$isFriendOfPaul = in_array( ObjectId('qqq...'), $friendsIds );

但如何在Mongo中查询呢?有什么想法吗?
3个回答

23

实际上,$in手册中说明了。


请展示给我查询语句。 这是与$in相反的查询方式。 - Void Floyd
1
如果字段保存的是一个数组,那么$in操作符会选择那些字段中包含至少一个元素与指定数组(例如<value1>、<value2>等)中的某个值匹配的文档。因此,你可以尝试使用以下代码:db.collection.find({friendsIDs: {$in: [YourIDValue]}}),以实现双向匹配。 - guessimtoolate
1
没有人提到让我摔倒的双关语吗? - Nebulosar

3
您的查询必须像这样:
db.collection.find({"name": "Paul", "friendsIDs": "qqq"}) 

这个查询会找到名称为PaulfriendsIDs等于qqq的文档。


'friendsIDs' 是一个 Id 列表(数组),而不是一个 ID。 - Void Floyd
3
即使friendsIDs是一个数组,这也能正常运行。 - JohnnyHK
https://docs.mongodb.com/manual/reference/operator/query/eq/#array-element-equals-a-value - Mohamed Ramrami

1

这也可以通过 $eq 来实现。

> db.person.insert({name: 'Paul', age: 43, friends: [1234, 2345, 3456]})
> db.person.insert({name: 'Dave', age: 23, friends: [2345, 3456]})
> db.person.insert({name: 'Stephen', age: 12, friends: [2345, 3456, 7890]})

以下是使用 $eq 的示例:
> db.person.find({friends: {$eq : 2345}}) 
{ "_id" : ObjectId("54e34124fe135475834334da"), "name" : "Paul", "age" : 43, "friends" : [ 1234, 2345, 3456 ] }
{ "_id" : ObjectId("54e34138fe135475834334db"), "name" : "Dave", "age" : 23, "friends" : [ 2345, 3456 ] }
{ "_id" : ObjectId("54e3414bfe135475834334dc"), "name" : "Stephen", "age" : 12, "friends" : [ 2345, 3456, 7890 ] }

但下面的查询也可以找到相同的结果。因此,正如Sven建议的那样,您可以省略$eq。
> db.person.find({friends: 2345})
{ "_id" : ObjectId("54e34124fe135475834334da"), "name" : "Paul", "age" : 43, "friends" : [ 1234, 2345, 3456 ] }
{ "_id" : ObjectId("54e34138fe135475834334db"), "name" : "Dave", "age" : 23, "friends" : [ 2345, 3456 ] }
{ "_id" : ObjectId("54e3414bfe135475834334dc"), "name" : "Stephen", "age" : 12, "friends" : [ 2345, 3456, 7890 ] }

> db.person.find({friends: 1234})
{ "_id" : ObjectId("54e34124fe135475834334da"), "name" : "Paul", "age" : 43, "friends" : [ 1234, 2345, 3456 ] }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接