我有一个产品集合,我想根据多个参数进行查询。其中一些在此处找到:
在产品内部:
"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
}
}
]
}
]
}
]
现在为了使其可配置化,我需要能够处理布尔逻辑、参数和值。因此,我想到将这样的查询本身存储在Mongo中,并让我的Java应用程序检索它。接下来要做的是在筛选器中使用它(例如find或其他操作),并且对相应的产品选择进行处理。这种方法的优点是,我实际上可以在程序之外分析数据和查询的有效性。
我会按名称将其存储在数据库中。例如:
{
"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."
}
})
看起来与上面的信息非常接近。
不用说,我对这里发生的事情一无所知,所以我希望这里的一些技术专家能够为此提供一些帮助和指导。