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 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?

使用 mongoose 从数组中返回匹配的文档

使用 mongoose 从数组中返回匹配的文档

Mongoose匹配元素或带有$ in语句的空数组

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

Mongoose更新嵌套数组