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

如何在mongodb中搜索记录而不提及字段名?,mongodb,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"

我正在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$/}})
要从每个字段(客户、电子邮件、提供商、地址、应用程序、电话)中搜索匹配的值,我必须用字段名写同一行,但如果我在booking对象下有100个字段,那么我需要用每个字段名写同一行100次。 我正在寻找一个从每个字段搜索的查询,为此我尝试了$text子句,如:bson.M{“\u id”:bson.M{'$type':“objectId”} 但是$text子句将只搜索全字而不是正则表达式(词干词)字示例:-
“这是一个字符串”
在这一行中,我想搜索
“str”
字,但它不会显示与其匹配的记录

有谁能给我举个例子吗。这要花我很多时间


感谢您帮助我解决这个问题。

聚合框架就是解决这个问题的方法。正如@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)或两者的标准,等等)


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

您需要管理您的文档结构,这样您就不会有500个字段。另外,您的预订不是一个数组,而是一个对象。lol对于这个错误@prajvalM表示抱歉,那么我应该采用什么结构来简化预订?为什么您会有500个fields@prajvalm因为对象将根据用户所做的更改进行检索,所以我举一个例子,如果用户根据他/她更改了许多字段,那么错误请参阅我将运行此命令
db.system.aggregate[{$project:{role:1,date:1,idairement:1,booking_值:{$objectToArray:“$booking”},]
这给了我
E QUERY[thread1]SyntaxError:expected expression,get']'@(shell):1:105
哦,太好了。@puneet5566788:该命令与matthPen建议的不完全一样。请多加注意。@SergioTulentsev yes Sorry先生你能告诉我我说的是正确的吗?或者wriong
matthPen
说,通过使用该命令,所有字段将变为
k
v
形式,然后我将使用单行命令轻松搜索记录。对吗?噢,谢谢你,先生@SergioTulentsev和
matthPen