【问题标题】:How to search for record in mongodb without mentioning the field name?如何在不提及字段名称的情况下在mongodb中搜索记录?
【发布时间】:2018-07-06 07:28:51
【问题描述】:

我正在 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$/}})

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

有人会建议任何例子吗?这将花费我很多时间。

帮我解决这个问题谢谢。

【问题讨论】:

  • 您需要管理您的文档结构,以便您没有 500 个字段。此外,您的预订不是一个数组,而是一个对象。
  • lol 很抱歉这个错误@prajvalM 那么我应该采用什么结构才能使其更容易??
  • 为什么会有 500 个字段
  • @prajvalm 因为该对象将根据用户所做的更改进行检索,所以我举一个例子,如果用户根据他/她更改了许多字段

标签: mongodb


【解决方案1】:

聚合框架就是这样。正如@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) 或两者兼有等...)

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

【讨论】:

  • 有一个错误我会运行这个命令db.system.aggregate[{$project: {role:1, date:1, idadress:1, booking_values:{$objectToArray:"$booking"}}},]);这给了我E QUERY [thread1] SyntaxError: expected expression, got ']' @(shell):1:105的错误
  • 哦,太好了。
  • @puneet55667788:该命令与 matthPen 建议的不太一样。多加注意。
  • @SergioTulentsev 是的,先生,对不起,你能告诉我我说的是对还是错matthPen 说通过使用该命令,所有字段都将变为kv表格然后我将使用单行命令轻松搜索记录。对吗?
  • 哦,谢谢先生@SergioTulentsev 和matthPen
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多