2014-03-14 38 views
3

一个文档{"m":[1,2,3], "others":xxx}项目元件中,通过在获得阵列的“m”的第一个元素:mongodb的阵列

db.find({query},{"m":{$slice:1}, "m":1}) 

返回的是{"m":[1]},在DOC的元件是一个数组。但是在这个查询中,数组中只有一个元素会被获取,所以我不需要返回doc包含只有一个元素的数组。这就像子查询中的SQL局部变量。我想要的元素在原文档没有名字,如果我要得到它,然后我需要做一个名字对于它的文档返回,我想是这样的:{“所以LocalVariable”:1},而不是{“M”:1 ]}

我尝试以伸出的第一要素:

db.find({query},{"m":{$slice:1}, "m.1":1}) 

但这不起作用。

+1

什么是问号? –

+0

@jean我猜你的意思。你想要:“**数组的**第一**元素**,但**不**作为数组值,** **只是**返回值?你不能这样做,而不是用find。也许对于聚合,但我仍然怀疑这是你真正想要的,只是学会使用数组返回值,它是一个包含一个元素的数组,这不应该很难,你提出这个问题的方式显然不是你真正的编码使用情况下,你会做的更好请教一个问题,是关于** **实际代码和问题,需要解决的问题。 –

+0

从JS API它确实是很难区分的。我使用C++的驱动程序,在这种情况下,代码写的很无聊每次我需要得到m个文档,并将其转换为DOC的容器,并获得第一个元素,然后将其转换为int值 – jean

回答

0

你似乎在寻找一个positional $操作者匹配。它的工作原理是这样的:

db.collection.find({ m: 2 },{ "m.$": 1 }) 

,将返回你的匹配元素

如果你实际上希望总是获得的第二个元素,那么你就需要两个参数形式$slice

db.collection.find({ },{ "m": { "$slice": [1,1] } }) 

测试输出:

db.test.insert({ m: [1,2,3] }) 
db.test.find({ },{ "m": {$slice: [1,1]} }) 

    { "_id" : ObjectId("5323cc2770fde63cf1146ba3"), "m" : [ 2 ] } 
+0

回报仍然是{“M”:[1]}。 – jean

+0

@jean不,它不。看到我已经运行的输出添加到答案 –

+0

我修改了我的问题Stion的。我希望它返回{“othername”:1}而不是{“m”:[1]}。我想投射出阵列中的元素 – jean