字段

时间:2017-10-09 10:12:40

标签: arrays ruby mongodb mongodb-query aggregation-framework

我需要在特定文档的字段中搜索文本。 请考虑以下文档......

"_id" : ObjectId("59cc8af23b86730a2c9a603f"),
    "social_friends" : {
            "google" : [
                {
                    "name" : "User one",
                    "id" : "1003153275"
                },
                {
                    "name" : "user two",
                    "id" : "10210778"
                },
                {
                    "name" : "user three",
                    "id" : "115131"
                },
                {
                    "name" : "user four",
                    "id" : "117113"
                }
            ]
    }

我想通过" name"来搜索用户, 例如:如果我搜索"四",我希望结果为

{
   "name" : "user four",
   "id" : "117113"
}

我尝试过创建文本索引并按

搜索
db.collection.find({$text:{$search:"user four"}}).pretty()

但它正在搜索集合中的所有文档,并返回多个文档,

然后我使用" _id"

进行过滤
db.collection.find({$text:{$search:"user four"},"_id" : ObjectId("59cc8af23b86730a2c9a603f")}).pretty()

但它返回整个文档而不是下面的子文档。

{
       "name" : "user four",
       "id" : "117113"
 }

首先,是否可以这样做?因为我是Mongo的新手,所以我们真的很感激。感谢。

1 个答案:

答案 0 :(得分:1)

我找到了一个可能有助于或至少引导您找到完整解决方案的部分解决方案:

db.collection.aggregate([
    {$match:{$text:{$search:"user four"}}},
    {$unwind:"$social_friends.google"},
    {$match:{"social_friends.google.name":"user four"}},
    {$project:{"doc":"$social_friends.google"}}
])

此外,如果您只想抓取第一个匹配的文档,只需添加{ $limit : 5 } 正常的find查询也是如此。

如果您想使用_id进行过滤,请在第一场比赛中使用以下内容:

{$match:{_id:ObjectId("59cc8af23b86730a2c9a603f"),$text:{$se‌​arch:"user four"}}}