我创建了一个有关使用$ match的主题,该主题已解决,但现在我陷入了一个更复杂的示例。例如,考虑我的Json的结构:
{
user: 'bruno',
answers: [
{id: 0, value: 3.5},
{id: 1, value: "hello"}
]
}
我想添加或排序,对仅包含标识符“ id”等于0的“值”中包含的值进行一些转换,例如排序方法。
考虑以下数据:
db.my_collection.insert({ user: 'bruno', answers: [ {id: 0, value: 3.5}, {id: 1, value: "hello"}]})
db.my_collection.insert({ user: 'bruno2', answers: [ {id: 0, value: 0.5}, {id: 1, value: "world"}]})
我尝试使用:
db.my_collection.aggregate ({$sort: {"answers": {"$elemMatch": {id: 0, value: -1}}}})
但是,它没有用。预期结果为:{user:'bruno2'答案:[{id:0,value:0.5},{id:1,value:“ world”}]},{user:'bruno'答案:[{id: 0,value:3.5},{id:1,value:“ hello”}]})
谢谢。
首先,请注意您的排序示例格式错误:aggregation方法将数组作为输入,其中数组中的每个元素都指定了聚合管道中的一个阶段。另外,请注意,$ elemMatch运算符不能用作$ sort阶段的一部分。
实现您的排序示例所用的一种方法是使用聚合框架的$ unwind管道运算符。展开数组将把数组元素一张一张地剥离到单独的文档中。例如下面的查询
db.my_collection.aggregate([ {$unwind: "$answers"} ]);
返回如下内容:
[
{
"_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
"user" : "bruno",
"answers" : {
"id" : 0,
"value" : 3.5
}
},
{
"_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
"user" : "bruno",
"answers" : {
"id" : 1,
"value" : "hello"
}
},
{
"_id" : ObjectId("523715813fac8e36fdb0b96f"),
"user" : "bruno2",
"answers" : {
"id" : 0,
"value" : 0.5
}
},
{
"_id" : ObjectId("523715813fac8e36fdb0b96f"),
"user" : "bruno2",
"answers" : {
"id" : 1,
"value" : "world"
}
}
]
添加$ match阶段将使您仅可以获取answer.id为零的文档。最后,$ sort阶段允许您按Answers.value进行排序。聚合查询总共是:
db.my_collection.aggregate([
{$unwind: "$answers"},
{$match: {"answers.id": 0}},
{$sort: {"answers.value": -1}}
]);
并输出:
[
{
"_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
"user" : "bruno",
"answers" : {
"id" : 0,
"value" : 3.5
}
},
{
"_id" : ObjectId("523715813fac8e36fdb0b96f"),
"user" : "bruno2",
"answers" : {
"id" : 0,
"value" : 0.5
}
}
]
根据您的要求,听起来好像永远不需要$ unwind甚至是聚合框架。相反,如果您要查找的文件的Answers.id等于0且Answers.value等于3.5,然后将answers.value更改为4,则可以将find与$ elemMatch一起使用,后跟db.collection.save():
doc = db.my_collection.findOne({"answers": {$elemMatch: {"id": 0, "value": 3.5}}});
for (i=0; i<doc.answers.length; i++) {
if (doc.answers[i].id === 0) {
doc.answers[i].value = 4;
db.my_collection.save(doc);
break;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句