0

我是新手NoSQLMongoDB我对我可以做哪些类型的查询以及如何做有点困惑。我的知识仅限于更简单的查询

我想让我认为它是一个复杂的查询,MongoDB而不是PHP用来对其进行排序,但我不知道它是否可能或如何去做。

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

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

第二级问题:然后我想订购查询,以便birds首先出现所有查询颜色的查询。

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

在此处输入图像描述

4

2 回答 2

1

您可以使用聚合框架。所以对于下一个数据集:

{ "_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
}
于 2013-08-08T06:15:42.700 回答
0

其中大部分是您必须在您的应用程序中完成的。为了找到所有带有“蓝色”标签的鸟的文档,您可以这样做:

db.collection.find( { tag: "blue" } );

哪些颜色是可选的并不重要,因为无论如何您都必须通过所需的标签找到。

找到它们后,您需要进行排序。但是你想要的排序(通过它们的 3 种颜色)不是你可以在 MongoDB 中做的事情,而是你必须在 PHP 中做的事情。

于 2013-07-31T09:32:00.250 回答