【问题标题】:All fields search [duplicate]所有字段搜索[重复]
【发布时间】:2016-08-12 08:39:35
【问题描述】:

这是我的数据集,它是更大的 json 代码的一部分。我想写一个查询,它将匹配价值链中的所有字段。

数据集:

"value_chain" : {
    "category" : "Source, Make & Deliver",
    "hpe_level0" : "gift Chain Planning",
    "hpe_level1" : "nodemand to Plan",
    "hpe_level2" : "nodemand Planning",
    "hpe_level3" : "nodemand Sensing"
},

示例:

如果有人搜索“gift”,查询应该扫描所有字段,如果匹配,则返回文档。

这是我尝试过的,但没有成功

db.sw_api.find({ 
    value_chain: { $elemMatch: { "Source, Make & Deliver" } } 
})

【问题讨论】:

  • 我对我的问题进行了一些修改

标签: node.js mongodb tree mongodb-query multi-level


【解决方案1】:

听起来您需要首先在所有文本字段上创建 $text 索引,因为它会对使用文本索引索引的字段的内容执行文本搜索:

db.sw_api.createIndex({
    "value_chain.category" : "text",
    "value_chain.hpe_level0" : "text",
    "value_chain.hpe_level1" : "text",
    "value_chain.hpe_level2" : "text",
    "value_chain.hpe_level3" : "text"
}, { "name": "value_chain_text_idx"});

你创建的索引是一个由5列组成的复合索引,如果你不覆盖mongo默认会自动为你创建文本命名空间。如上,如果不指定索引名称为

db.sw_api.createIndex({
    "value_chain.category" : "text",
    "value_chain.hpe_level0" : "text",
    "value_chain.hpe_level1" : "text",
    "value_chain.hpe_level2" : "text",
    "value_chain.hpe_level3" : "text"
});

有一个潜在的错误"ns name is too long (127 byte max)",因为文本索引如下所示:

"you_db_name.sw_api.$value_chain.category_text_value_chain.hpe_level0_text_value_chain.hpe_level1_text_value_chain.hpe_level2_text_value_chain.hpe_level3_text"

因此,如果由 mongo 自动生成,则需要给它一个不会太长的名称。

创建索引后,db.sw_api.getIndexes() 查询将显示存在的索引:

/* 1 */
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "dbname.sw_api"
    },
    {
        "v" : 1,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "value_chain_text_idx",
        "ns" : "dbname.sw_api",
        "weights" : {
            "value_chain.category" : 1,
            "value_chain.hpe_level0" : 1,
            "value_chain.hpe_level1" : 1,
            "value_chain.hpe_level2" : 1,
            "value_chain.hpe_level3" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
    }
]

创建索引后,您可以进行 $text 搜索:

db.sw_api.find({ "$text": { "$search": "gift" } })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多