如何通过mongodb中的Tag有条件地查找项目

时间:2013-07-31 09:04:09

标签: php sql mongodb nosql

我是NoSQLMongoDB的新手,我对我可以做什么类型的查询以及如何执行这些查询感到有些困惑。我的知识仅限于更简单的查询

我想在MongoDB内制作我认为是复杂查询的内容,而不是使用PHP对其进行排序,但我不知道是否可行或如何进行排序。

我的收藏中有一个tag字段array{tag: ["blue","red","yellow","green","violet"]}

第一级问题:我想说我想找到birds tag的所有blue & yellow & green,其中blue必须tag且任意birds其他颜色是可选的。

第二级问题:然后我想订购查询,以便首先显示所有查询颜色的{{1}}。

是否可以在mongoDB中创建此查询?如果是我怎么能这样做?

enter image description here

2 个答案:

答案 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做的事情。