如何检查Mongodb中的Array元素的顺序?

时间:2014-04-28 02:56:32

标签: mongodb mongodb-query aggregation-framework

在MongoDB中,有没有简单的方法来检查数组中的元素顺序?例如,我有一个这样的文件:

{
    _id: 1,
    tags: ["mongodb", "rethinkdb", "couchbase", "others"]
}

我想检查标记字段,如果mongodbrethinkdb之前或之前(让我们看一下数组元素,mongodb = 0,rethinkdb = 1索引,那么mongodb首先和我们的案例相匹配。)? 但是如果有另一个文档(如下所示)rethinkdb出现在mongodb之前,则该案例不匹配。

{
  _id: 2,
  tags: ["rethinkdb", "mongodb", "couchbase"]
 }

这里mongodb(1)位于rethinkdb(0)之后,所以我们的情况不匹配。

1 个答案:

答案 0 :(得分:2)

你的问题并不像你想象的那么清楚,因此为什么有几种方法可以回答它:

如果您只是想知道文档是否有“mongodb”作为数组的第一个元素,那么您只需发出如下查询:

db.collection.find({ "tags.0": "mongodb" })

这将使用“点符号”仅返回与指定索引位置的给定值匹配的文档。

如果你真的希望匹配一个数组是否处于“预期顺序”,那么你可以从聚合管道获得一些帮助,并设置可用的运算符和MongoDB 2.6中的其他功能:

db.collection.aggregate([
    { "$project": {        
        "$_id": "$$ROOT",
        "matched": { "$setEquals": [ 
            "$tags", 
           ["mongodb", "rethinkdb", "couchbase", "others"]
        ]}
    }},
    { "$match": { "matched": true }}
])

或者,如果你想要确保“mongodb”值在“rethinkdb”值之前,那么你将需要在JavaScript中使用mapReduce进行评估,或者像$where运算符那样同样不太好:

db.collection.find({
    "$where": function() {
        return this.tags.indexOf("mongodb") < this.tags.indexOf("rethinkdb");
    }
})