gpt4 book ai didi

mongodb - 在 Mongo 中存储查询

转载 作者:可可西里 更新时间:2023-11-01 09:14:08 26 4
gpt4 key购买 nike

情况是这样的:我想根据一组参数配置应在 sjop 中列出哪些项目的网上商店。我希望它是可配置的,因为这让我可以试验不同的参数,也可以轻松地更改它们的值。

我有一个要根据多个参数查询的产品集合。在这里可以找到其中的几个:

产品内:

"delivery" : {
"maximum_delivery_days" : 30,
"average_delivery_days" : 10,
"source" : 1,
"filling_rate" : 85,
"stock" : 0
}

但也存在其他参数。

决定是否包含产品的此类查询的示例可能是:

"$or" : [
{
"delivery.stock" : 1
},
{
"$or" : [
{
"$and" : [
{
"delivery.maximum_delivery_days" : {
"$lt" : 60
}
},
{
"delivery.filling_rate" : {
"$gt" : 90
}
}
]
},
{
"$and" : [
{
"delivery.maximum_delivery_days" : {
"$lt" : 40
}
},
{
"delivery.filling_rate" : {
"$gt" : 80
}
}
]
},
{
"$and" : [
{
"delivery.delivery_days" : {
"$lt" : 25
}
},
{
"delivery.filling_rate" : {
"$gt" : 70
}
}
]
}
]
}
]

现在要使其可配置,我需要能够处理 bool 逻辑、参数和值。所以,我想到了,因为这样的查询本身是 JSON,所以将它存储在 Mongo 中并让我的 Java 应用程序检索它。接下来是在过滤器中使用它(例如查找或其他)并处理相应的产品选择。这种方法的优点是我实际上可以在我的程序之外分析数据和查询的有效性。

我会按名称将其存储在数据库中。例如。

{ 
"name": "query1",
"query": { the thing printed above starting with "$or"... }
}

使用:

db.queries.insert({
"name" : "query1",
"query": { the thing printed above starting with "$or"... }
})

结果是:

2016-03-27T14:43:37.265+0200 E QUERY    Error: field names cannot start with $ [$or]
at Error (<anonymous>)
at DBCollection._validateForStorage (src/mongo/shell/collection.js:161:19)
at DBCollection._validateForStorage (src/mongo/shell/collection.js:165:18)
at insert (src/mongo/shell/bulk_api.js:646:20)
at DBCollection.insert (src/mongo/shell/collection.js:243:18)
at (shell):1:12 at src/mongo/shell/collection.js:161

但我可以使用 Robomongo 存储它,但并非总是如此。显然我做错了什么。但我不知道它是什么。如果失败了,我创建一个全新的集合并再试一次,它就成功了。超出我理解范围的奇怪东西。

但是当我尝试更新“查询”中的值时,更改并没有完成。绝不。有时甚至没有。但是,我可以创建一个新对象并丢弃前一个对象。因此,有解决方法。

db.queries.update(
{"name": "query1"},
{"$set": {
... update goes here ...
}
}
)

这样做的结果是:

WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 52,
"errmsg" : "The dollar ($) prefixed field '$or' in 'action.$or' is not valid for storage."
}
})

似乎与上面的其他消息非常接近。

不用说,我对这里发生的事情一无所知,所以我希望这里的一些巫师能够对此事有所了解

最佳答案

我认为错误消息包含您需要考虑的重要信息:

QUERY Error: field names cannot start with $

由于您试图在文档中存储查询(或查询的一部分),因此您最终会得到包含 mongo 运算符关键字的属性名称(例如 $or $ne, $gt). The mongo documentation actually references this exact scenario - 添加了强调

Field names cannot contain dots (i.e. .) or null characters, and they must not start with a dollar sign (i.e. $)...


在这些情况下,我不会信任第 3 方应用程序,例如 Robomongo。我建议直接在 mongo shell 中调试/测试这个问题。

我的建议是在您的文档中存储查询的转义版本,以免干扰保留的运算符关键字。您可以使用可用的 JSON.stringify(my_obj); 将您的部分查询编码为一个字符串,然后在您选择稍后检索它时解析/解码它:JSON.parse(escaped_query_string_from_db )

关于mongodb - 在 Mongo 中存储查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36247776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com