如何在mongodb中搜索记录而不提及字段名称?

时间:2018-07-06 07:28:52

标签: mongodb

我正在mongodb中搜索满足我的搜索条件的查询。我在db集合中有一条记录:

{
 "_id": ObjectId("5b3d970398e9d099427896c3"),
 "role": "New Booking is there by abc",
 "date": "07/04/2018",
 "idaddress": "213.123.123.213",
 "booking": {
   "bedroom": 4,
   "bathroom": 6,
   "customer": "abc",
   "email": "abc@gmail.com",
   "provider": "provider1",
   "address": "brazil",
   "appt": "123456",
   "phone": "987654321"
 }
}

在此记录booking对象中有8个字段,为了进行搜索,我正在使用查询:

db.collection_name.find({ "booking.field_name" : {$regex : /data$/}})

要搜索与每个字段(客户,电子邮件,提供商,地址,appt,电话)匹配的值,我必须在字段名称中写同一行,但是如果预订对象下有100个字段,则需要每个字段名称在同一行写100次。 我正在寻找一个从每个字段中搜索的查询,为此,我尝试了$ text子句,例如:bson.M {“ _ id”:bson.M {'$ type':“ objectId”}} 但是$ text子句只会搜索完整的单词,而不是正则表达式(词干)单词示例:-"This is a string"在此行中,我想搜索"str"单词,但不会显示匹配的记录

任何人都可以提出任何示例。这需要我很多时间。

帮助我解决了这个问题,谢谢。

1 个答案:

答案 0 :(得分:2)

聚合框架就是方法。正如@Prajval所说,您有一个对象,因此解决方案是在查询之前将其转换为数组。这是代码:

db.test1.aggregate(
    [
        {
            $project: {
                role:1,
                date:1,
                idadress:1,
                booking_values:{$objectToArray:"$booking"}
            }
        },
    ]
);

这将输出

{ 
    "_id" : ObjectId("5b3d970398e9d099427896c3"), 
    "role" : "New Booking is there by abc", 
    "date" : "07/04/2018", 
    "booking_values" : [
        {
            "k" : "bedroom", 
            "v" : NumberInt(4)
        }, 
        {
            "k" : "bathroom", 
            "v" : NumberInt(6)
        }, 
        {
            "k" : "customer", 
            "v" : "abc"
        }, 
        {
            "k" : "email", 
            "v" : "abc@gmail.com"
        }, 
        {
            "k" : "provider", 
            "v" : "provider1"
        }, 
        {
            "k" : "address", 
            "v" : "brazil"
        }, 
        {
            "k" : "appt", 
            "v" : "123456"
        }, 
        {
            "k" : "phone", 
            "v" : "987654321"
        }
    ]
}

从这里您可以轻松地添加聚合阶段以获得所需的准确结果。 (整个文件或仅与条件相匹配的预订值,预订字段名称(k)的条件,预订字段值(v)或两者都有的条件,等等...)

如果您需要帮助来实现这一目标,只需提供预期的结果即可。