繁体   English   中英

MongoDB聚合正则表达式匹配或全文搜索返回整个文档

[英]MongoDB Aggregate Regex Match or Full Text Search returns whole Document

防爆。 记录

[
  {
  "_id": "5528cfd2e71144e020cb6494",
  "__v": 11,
  "Product": [
                {
                "_id": "5528cfd2e71144e020cb6495",
                "isFav": true,
                "quantity": 27,
                "price": 148,
                "description": "100g",
                "brand": "JaldiLa",
                "name": "Grapes",
                "sku": "GRP"
                },
                {
                "_id": "552963ed63d867b81e18d357",
                "isFav": false,
                "quantity": 13,
                "price": 290,
                "description": "100g",
                "brand": "JaldiLa",
                "name": "Apple",
                "sku": "APL"
                }
            ],
  "brands": [
            "Whole Foods",
            "Costco",
            "Bee's",
            "Masons"
            ],
  "sku": "FRT",
  "name": "Fruits"
  }
]

我的Mongoose函数从AngularJS返回查询( http:// localhost:8080 / api / search?s =

router.route('/search')
    .get(function(req, res) {
        Dept.aggregate(
                { $match: { $text: { $search: req.query.s } } }, 
                { $project : { name : 1, _id : 1,  'Product.name' : 1, 'Product._id' : 1} },
                { $unwind : "$Product" },
                { $group : {
                    _id : "$_id",
                    Category : { $addToSet : "$name"},
                    Product : { $push : "$Product"}
                }}
        )
    });

结果:例如http:// localhost:8080 / api / search?s = Apple / Grape / Carrot,结果对所有人都相同。

[
  {
  "_id": "5528cfd2e71144e020cb6494",
  "Category": ["Fruits"],
  "Product": [
              {
              "_id": "5528cfd2e71144e020cb6495",
              "name": "Grapes"
              },
              {
              "_id": "552963ed63d867b81e18d357",
              "name": "Apple"
              },
              {
              "_id": "552e61920c530fb848c61510",
              "name": "Carrots"
              }
            ]
  }
]    

问题:在查询“ apple”时,它返回Product中的所有对象,而不仅仅是“ grapes”,我认为也许在展开后放置匹配会解决问题或$ regex情况

我想要的是:例如,对于“ grape”的searchString来说,我还希望它在发送查询的前两个字母后立即开始发送结果。

[{
  "_id": ["5528cfd2e71144e020cb6494"], //I want this in array as it messes my loop up
  "Category": "Fruits", //Yes I do not want this in array like I'm getting in my resutls
  "Product": [{
              "_id": "5528cfd2e71144e020cb6495",
              "name": "Grapes"
              }]
}]

感谢您的耐心等待。

使用以下聚合管道:

var search = "apple",
    pipeline = [
        {
            "$match": {
                "Product.name": { "$regex": search, "$options": "i" }  
            }
        },
        {
            "$unwind": "$Product"
        },
        {
            "$match": {
                "Product.name": { "$regex": search, "$options": "i" }
            }
        },
        {
            "$project": {
                "Category": "$name",
                "Product._id": 1,
                "Product.name": 1
            }
        }
    ];

    db.collection.aggregate(pipeline);

使用上面的示例文档和正则表达式(不区分大小写)在Product数组的name字段上搜索“ apple”,上面的聚合管道将产生结果:

输出

/* 1 */
{
    "result" : [ 
        {
            "_id" : "5528cfd2e71144e020cb6494",
            "Product" : {
                "_id" : "552963ed63d867b81e18d357",
                "name" : "Apple"
            },
            "Category" : "Fruits"
        }
    ],
    "ok" : 1
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM