带有正则表达式的 MongoDB $elemMatch仅返回单个文档数组中的一个元素



我想要在嵌套数组中进行字符串搜索。对于每个文档,它只返回第一个匹配的数组元素,尽管文档中有一个匹配的数组元素。 蒙戈结构:

{
"bookmarkId" : "5b9ce0be489cdc34ffa9d650",
"notes" : [
{
"noteId" : "5b9ce0be489cdc34ffa9d650",
"note" : "number"
},
{
"noteId" : "5b9ce4ba489cdc34ffa9d653",
"note" : "hhgjjkg"
},
{
"noteId" : "5b9ce4cc489cdc34ffa9d654",
"note" : "test"
},
{
"noteId" : "5b9ce8a2a3219b3f166cc5de",
"note" : "hhgjjkg"
},
{
"noteId" : "5b9cf703a3219b3f166cc5ea",
"note" : "number"
}
],
"userId" : "5aeae1da9072420ff68bd48e"
}

mongodb 查询是:

db.bookmark.find({"userId" : "5aeae1da9072420ff68bd48e","notes.note":new RegExp('hgjj', 'i')},{_id:0,bookmarkId:1,notes:{$elemMatch:{note:new RegExp('hgjj', 'i')}}})

尽管第 2 个和第 4 个元素与查询匹配,但它只返回第一个元素。 输出:

{ "bookmarkId" : "5b9ce0be489cdc34ffa9d650", "notes" : [ { "noteId" : "5b9ce4ba489cdc34ffa9d653", "note" : "hhgjjkg" } ] }

如何从 mongodb 获取所有匹配的元素?

基于查找投影的 mongoDB 文档,你不能使用 $elemMatch 来过滤元素。

相反,您可以使用聚合:

db.bookmark.aggregate([
{
$unwind: '$notes'
},
{
$match: {"userId" : "5aeae1da9072420ff68bd48e","notes.note":new RegExp('hgjj', 'i')}
},
{
$group: {
_id: '$bookmarkId',
notes: {$push : '$notes'}
}
},
{
$project: {
_id: 0,
bookmarkId: '$_id',
notes: '$notes'
}
}])

看这里: https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/

定义$elemMatch: $elemMatch运算符限制 查询结果中仅包含第一个的字段 元素与$elemMatch条件匹配。

因此,如果使用 elemMatch 运算符计算投影,则只会投影嵌套数组中匹配的第一个元素。

对我来说,您似乎想创建一个仅包含匹配的嵌套文档的新"notes"数组。一种方法是通过聚合框架进行分组:

db.bookmark.aggregate([
{
"$match": {
"userId" : "5aeae1da9072420ff68bd48e",
"notes.note":new RegExp('hgjj', 'i')
}        
}, 
{
"$unwind": {
"path": "$notes"
}
}, 
{
"$match": {
"notes.note": new RegExp('hgjj', 'i')
}
}, 
{
"$group": {
"_id": "$_id",
"bookmark_id": {
"$first": "$bookmarkId"
},
"notes": {
"$push": "$notes"
}        
}
},
{
"$project": {
"_id": 0,
"bookmark_id": 1,
"notes": 1
}
}
])

收益 率:

{ "bookmark_id" : "5b9ce0be489cdc34ffa9d650", "notes" : [ { "noteId" : "5b9ce4ba489cdc34ffa9d653", "note" : "hhgjjkg" } ] }
{ "bookmark_id" : "5b9ce0be489cdc34ffa9d650", "notes" : [ { "noteId" : "5b9ce8a2a3219b3f166cc5de", "note" : "hhgjjkg" } ] }
{ "bookmark_id" : "5b9ce0be489cdc34ffa9d650", "notes" : [ { "noteId" : "5b9ce4ba489cdc34ffa9d653", "note" : "hhgjjkg" }, { "noteId" : "5b9ce8a2a3219b3f166cc5de", "note" : "hhgjjkg" } ] }

最新更新