Mongoose 获取与数组匹配的文档
Posted
技术标签:
【中文标题】Mongoose 获取与数组匹配的文档【英文标题】:Mongoose get docs matching the array 【发布时间】:2014-05-16 09:03:53 【问题描述】:我有这样的架构
members: [
type: Schema.Types.ObjectId,
ref: 'User'
]
createdAt:
type: Date,
default: Date.now
...
文档是
1-
members:
["some id 1", "some id 2"]
,
createdAt: "someTime ago"
2-
members:
["some id 1", "some id 2", "some id 3"]
,
createdAt: "someTime ago"
我想找到与元素数组完全匹配的文档
['some id 1', 'some id 2']
即上述示例文档中的 doc 1
这怎么可能? 任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:只要您意识到您匹配的是 ObjectId 而不是引用集合中的任何内容,您就可以使用$in
运算符:
db.collection.find( "members": "$in": [ "some id 1", "some id 2" ] )
这些当然是您的实际 ObjectId 值。
但如果你真的是指一个包含该数组的文档,那么你只需传入数组:
db.collection.find( "members": [ "some id 1", "some id 2" ] )
如果它必须同时包含这两个元素,但可以包含其他元素,那么目前您需要使用 $and
表达式:
db.collection.find( "$and": [
"members": "some id 1" ,
"members": "some id 2"
])
但从 2.6 版开始,您可以正确使用 $all
运算符来有效地执行相同的操作:
db.collection.find( "members": "$all": [ "some id 1", "some id 2" ] )
另一种形式只匹配这两个元素,但顺序不限。所以有两种方法:
db.collection.find( "$or": [
"members": [ "some id 1", "some id 2" ] ,
"members": [ "some id 2", "some id 1" ]
])
这使用逻辑$or
表示数组必须是精确的,但可以以任何一种方式排列。而另一种方法:
db.collection.find( "$and": [
"members": "some id 1" ,
"members": "some id 2"
"members": "$size": 2
])
所以这将使用$size
以确保当数组包含两个匹配的元素时,它也只有两个元素。这比使用$or
更好的语法,尤其是对于较大的数组。
如前所述,在未来的版本中,这会变得更加清晰:
db.collection.find( "$and": [
"members": "$all": [ "some id 1", "some id 2" ] ,
"members": "$size": 2
])
几乎涵盖了所有的解释
【讨论】:
感谢您的回答。我会检查它 此查询返回包含这些 ID 的所有文档(文档 1 和文档 2)。不是特定的文档(即上例中的 doc1) @muhammedbasil 不确定我完全理解您想要哪个选项您可能想要完全匹配或使用 $and 如编辑所示。 知道了 :-),非常感谢@Neil Lunn,我对 $and 方法做了一个小修改,添加了 $size。现在它返回了我想要的那个...... @muhammedbasil 鉴于最后的评论,我明白你现在的目标是什么。另一种方法是使用第二种形式作为数组的精确匹配,但包装在 $or 条件中,另一个参数以相反的顺序。但是,是的,将 $size 添加到 $and 以确保只有 2 个元素是一种更好的方法。我可能还会添加这两个内容,以供人们将来参考。以上是关于Mongoose 获取与数组匹配的文档的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mongoose 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?