我是NoSQL
和MongoDB
的新手,我对我可以做什么类型的查询以及如何执行这些查询感到有些困惑。我的知识仅限于更简单的查询
我想在MongoDB
内制作我认为是复杂查询的内容,而不是使用PHP
对其进行排序,但我不知道是否可行或如何进行排序。
我的收藏中有一个tag
字段array
。 {tag: ["blue","red","yellow","green","violet"]}
。
第一级问题:我想说我想找到birds
tag
的所有blue & yellow & green
,其中blue
必须tag
且任意birds
其他颜色是可选的。
第二级问题:然后我想订购查询,以便首先显示所有查询颜色的{{1}}。
是否可以在mongoDB中创建此查询?如果是我怎么能这样做?
答案 0 :(得分:1)
您可以使用aggregation framework。所以对于下一个数据集:
{ "_id":ObjectId(...), "bird":1, "tags":["blue","red","yellow","green","violet"]}
{ "_id":ObjectId(...), "bird":2, "tags":["red","yellow","green","violet"] }
{ "_id":ObjectId(...), "bird":3, "tags":["blue","yellow","violet"] }
{ "_id":ObjectId(...), "bird":4, "tags":["blue","yellow","red","violet"] }
{ "_id":ObjectId(...), "bird":5, "tags":["blue"] }
我们可以应用下一个查询:
colors = ["blue","red","yellow","green"];
db.birds.aggregate(
{ $match: {tags: 'blue'} },
{ $project: {_id:0, bird:1, tags:1} },
{ $unwind: '$tags' },
{ $match: {tags: {$in: colors}} },
{ $group: {_id:'$bird', score: {$sum:1}} },
{ $sort: {score:-1} },
{ $project: {bird:'$_id', score:1, _id:0} }
)
并将获得如下结果:
{
"result" : [
{ "score" : 4, "bird" : 1 },
{ "score" : 3, "bird" : 4 },
{ "score" : 2, "bird" : 3 },
{ "score" : 1, "bird" : 5 }
],
"ok" : 1
}
答案 1 :(得分:0)
您需要在应用程序中执行大部分操作。为了找到鸟的标签为“蓝色”的所有文件,您可以这样做:
db.collection.find( { tag: "blue" } );
哪些颜色是可选的并不重要,因为您必须通过所需的标签找到。
找到它们之后,你需要做一个排序。但是你想要的东西(通过3种颜色)不是你可以在MongoDB中做的事情,而是你需要用PHP做的事情。