【问题标题】:How to put an array with or between items in mongodb projection query?如何在 mongodb 投影查询中放置一个包含项目或项目之间的数组?
【发布时间】:2014-09-16 21:31:34
【问题描述】:

我有一个 mongodb 数据库,它以以下格式存储项目:

{
"2013" : {
    "2" : {
        "1" : {
            "item1" : {
                "1" : {
                    "a_type" : 10,
                    "b_type" : 5,
                }
            },
            "item2" : {
                "v1" : {
                    "a_type" : 10,
                    "b_type" : 5,
                }
            },
        },
        "3" : {
            "item1" : {
                "1" : {
                    "a_type" : 10,
                    "b_type" : 5
                },
                "3" : {
                    "a_type" : 10,
                    "b_type" : 5
                }
            },
            "item2" : {
                "v1" : {
                    "a_type" : 10,
                    "b_type" : 5
                }
            },
        }
    }
}
"2014" : {
    "1" : {
        "5" : {
            "item1" : {
                "1" : {
                    "a_type" : 10,
                    "b_type" : 5
                }
            },
            "item2" : {
                "v2" : {
                    "a_type" : 10,
                    "b_type" : 5
                }
            },
        },     
    },
}
"_id" : ObjectId("53b82417a4b4939c27e300ed")
}

我想通过我的查询在特定日期获取一些特定项目数据。我可以用硬编码完成一天或更长时间,但我想给它一个数组,该数组将自动填充特定日期和项目名称,但在堆栈和 mongo 文档中搜索超过一天后我找不到任何事物。请帮我解决一下这个。 获取一个特定项目和日期的查询是这样的:

db.collection(collectionName).findOne({}, {'2013.2.1.item1': 1, '2014.1.5.item2': 1},  function(err, res});

谢谢

【问题讨论】:

  • 结构对你没有帮助。 MongoDB 不能“遍历”这样命名的键,而不求助于 JavaScript 评估,这是一个相当慢的选择。您需要在此处更改您的架构,但这将有助于添加对所有这些字段应该表示的内容的一些解释。
  • 是的,结构不是很好,但我无法改变它。我为项目所有者更改了标签,但前三层是年、月和日,更深的层是例如一些设备的名称、型号以及关于它们的负数和正数 cmets。

标签: node.js mongodb mongodb-query mongoskin


【解决方案1】:

想象一下包含查询项的数组是:

 var query = ['2013.2.1', '2014.1.5'];

由于你的数据库结构,你必须使用 MongoDB 投影来提取查询项,所以你应该这样做

var projectionObj = {};
for(var item in query) {
    projectionObj[item] = 1;
}

它会产生波纹管对象:

{
    '2013.2.1': 1,
    '2014.1.5': 1
}

然后你可以像这样将它传递给 MongoDB 查找函数:

db.collection([collectionName]).find({}, projectionObj);

它会返回你想要的。

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 2019-01-31
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多