我想找到ingredients
的元素0为apple
的所有文档。所以我想得到1号文件和3号文件,但不是2.是否可以在Mongo本地使用这种东西?
这个例子没有意义,但是我的应用程序太复杂了,不能放在这里。
{
_id => 1
name => 'best smoothie'
ingredients => Array
(
[0] => apple
[1] => raspberry
[2] => orange
[3] => banana
)
}
{
_id => 2
name => 'summer smoothie'
ingredients => Array
(
[0] => lemon
[1] => mint
[2] => apple
)
}
{
_id => 3
name => 'yogurt smoothie'
ingredients => Array
(
[0] => apple
[1] => blueberry
)
}
答案 0 :(得分:4)
您可以使用数组位置运算符(docs)。有用的是,您可以使用相同的模式并指定特定的索引,而不是使用通用的$
语法。
假设这是您的数据:
> db.so1.insert({name:"best smoothie", ingredients: ['apple','raspberry','orange','banana']})
> db.so1.insert({name:"summer smoothie", ingredients: ['lemon','mint','apple']})
> db.so1.insert({name:"yogurt smoothie", ingredients: ['apple','blueberry']})
如果要将搜索限制为仅索引位置0
,只需将其添加到数组属性名称,如下所示:
> db.so1.find({'ingredients.0':'apple'})
结果:
{
"_id" : ObjectId("51c4425ff227e278e59f5df5"),
"name" : "best smoothie",
"ingredients" : [
"apple",
"raspberry",
"orange",
"banana"
]
}
{
"_id" : ObjectId("51c4428af227e278e59f5df7"),
"name" : "yogurt smoothie",
"ingredients" : [
"apple",
"blueberry"
]
}
答案 1 :(得分:1)
您应该将$unwind
与$project
mongo函数一起使用。
`$unwind` - split up array
`$project` - add smth like index for each splitted element
之后可以使用简单的findOne
语句。
答案 2 :(得分:0)
我看不到使用简单array
实现此目的的任何方法。但是,您可以使用一系列哈希来执行此操作:
> db.collections.find()
{ "_id" : ObjectId("51c400d2b9f10d2c26817c5f"), "ingredients" : [ { "value1" : "apple" }, { "value2" : "orange" } ] }
{ "_id" : ObjectId("51c400dbb9f10d2c26817c60"), "ingredients" : [ { "value1" : "mint" }, { "value2" : "apple" } ] }
{ "_id" : ObjectId("51c400e1b9f10d2c26817c61"), "ingredients" : [ { "value1" : "apple" }, { "value2" : "lemon" } ] }
> db.collections.find({ ingredients: { $elemMatch: { value1: 'apple' }}})
{ "_id" : ObjectId("51c400d2b9f10d2c26817c5f"), "ingredients" : [ { "value1" : "apple" }, { "value2" : "orange" } ] }
{ "_id" : ObjectId("51c400e1b9f10d2c26817c61"), "ingredients" : [ { "value1" : "apple" }, { "value2" : "lemon" } ] }