在MongoDB中,有没有简单的方法来检查数组中的元素顺序?例如,我有一个这样的文件:
{
_id: 1,
tags: ["mongodb", "rethinkdb", "couchbase", "others"]
}
我想检查标记字段,如果mongodb
在rethinkdb
之前或之前(让我们看一下数组元素,mongodb = 0,rethinkdb = 1索引,那么mongodb首先和我们的案例相匹配。)?
但是如果有另一个文档(如下所示)rethinkdb
出现在mongodb
之前,则该案例不匹配。
{
_id: 2,
tags: ["rethinkdb", "mongodb", "couchbase"]
}
这里mongodb(1)位于rethinkdb(0)之后,所以我们的情况不匹配。
答案 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");
}
})