情况就是这样:一个网上商店,我想根据一组参数配置哪些项目应该在sjop中列出.
我希望这是可配置的,因为这允许我尝试不同的参数也很容易改变它们的值.
我有一个我想根据多个参数查询的Product集合.
其中有几个在这里找到:
产品内:
"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
}
}
]
}
]
}
]
现在要使这个可配置,我需要能够处理布尔逻辑,参数和值.
所以,我有了这个想法,因为这样的查询本身就是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."
}
})
看起来非常接近上面的其他消息.
需要说的是,我对这里发生的事情一无所知,所以我希望这里的一些w w能够对此事有所了解
最佳答案 我认为错误消息包含您需要考虑的重要信息:
QUERY Error: field names cannot start with $
由于您试图在文档中存储查询(或其中一部分),因此最终会得到包含mongo运算符关键字的属性名称(例如$或$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. $)…
在这些情况下,我不相信像Robomongo这样的第三方应用程序.我建议直接在mongo shell中调试/测试这个问题.
我的建议是在您的文档中存储转义版本的查询,以免干扰保留的运算符关键字.您可以使用可用的JSON.stringify(my_obj);将您的部分查询编码为字符串,然后在您选择稍后检索它时解析/解码它:JSON.parse(escaped_query_string_from_db)