我想要在嵌套数组中进行字符串搜索。对于每个文档,它只返回第一个匹配的数组元素,尽管文档中有一个匹配的数组元素。 蒙戈结构:
{
"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" } ] }