检索数组的索引
我有这样的文件
... "users" : [ { "name":"Bob" }, { "name":"Foo" }, { "name":"Bar" }, { "name":"Boo" } ] ...
我想findBar的索引
db.coll.find({"users.name":"Bar"})
我可以检索用户数组内的酒吧索引吗? (在这种情况下:2)
我真的不认为你所问的问题会导致你想要的实际答案,但是我会通过几件事来澄清一些误解。
.find()
等操作仅返回文档中的“字段存在”。 它不以任何方式创造“新的结果”。 目前唯一的例外是$meta
操作,当与$text
操作符一起用于文本search时,它目前仅具有“textScore”。
有一个位置$
操作符,它保持第一个匹配数组元素的“匹配”位置。 但是这个值本身不能被“投影”,只能用作占位符来返回匹配位置的数组元素:
db.collection.find({ "users.name": "Bar" }, { "users.$": 1 })
它只是返回数组中的匹配元素而没有其他元素。
为了获得实际的匹配位置,您通常需要检查代码中的数组以查找匹配的索引位置。 因此,检索文档,然后检查数组以查找匹配的索引。
如果你想通过多个文档来完成这个任务,那么你几乎可以在mapReduce操作中做同样的事情。 有关mongoose的完整示例:
var async = require('async'), mongoose = require('mongoose'), Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/test'); var userFieldSchema = new Schema({ name: String },{ "_id": false }); var userSchema = new Schema({ users: [userFieldSchema] }); var User = mongoose.model( "User", userSchema, "users" ); var value = "Bar"; var o = {}; o.map = function() { emit( this._id, this.users.map( function(x) { return x.name == value }).indexOf(true) ); }; o.reduce = function(){}; o.query = { "users.name": value }; o.scope = { value: value }; User.mapReduce(o, function(err,results) { if ( err ) throw err; console.log( results ); });
返回的结果是匹配条件的文档的_id
和被测数组中相应的匹配“索引”值。
只有mapReduce和aggregate这样的操作实际上“改变”了返回结果中正在处理的文档的内容。 所以目前还没有实现,可以通过.find()
等操作来实现。