我有一个像这样的
的json对象数组[{firstname: "Tom", lastname: "Smith"}, {firstname: "Bob", lastname: "Smith"}]
我想知道该数组中的元素是否位于User对象中,其字段名称也包含json对象数组。
User对象的一个例子是
{ "names": [{firstname: "joe", "lastname":"smith"}, {"firstname": "john", "lastname":"doe"}]}
我想知道这些名称中的任何对象是否包含在一个名为list2的随机长度数组中,格式如下
[{firstname: "Tom", lastname: "Smith"}, {firstname: "Bob", lastname: "Smith"}, {firstname: "Joe", lastname: "Smith"}, {firstname: "Jordan", lastname: "Smith"}, {firstname: "John", lastname: "Smith"}, {firstname: "Bill", lastname: "Smith"}]
如何创建一个mongoose查询呢?
谢谢!
答案 0 :(得分:2)
假设您正在搜索的数组称为“列表”,如果您的对象始终包含这两个字段,则可以使用$in
运算符
{
"names": {
"$in": [
{ "firstname": "Tom", "lastname": "Smith" },
{ "firstname": "Bob", "lastname": "Smith" }
]
}
}
如果这些对象可能会有所不同并且包含其他字段,那么您可以使用$or
和$elemMatch
执行此操作:
{
"$or": [
{ "names": {
"$elemMatch": { "firstname": "Tom", "lastname": "Smith" }
}},
{ "names": {
"$elemMatch": { "firstname": "Bob", "lastname": "Smith" }
}},
]
}
如果要查找包含两个对象的文档,请将$or
运算符换成$and
。
您似乎正在努力解决的问题是这在您的计划中是如何应用的。当然,我们从来没有像这样硬编码查询,我们只是使用数据类型来构造它们。因此,如果您的数据实际上符合使用$ in的条件,那么您的代码看起来像这样:
// A list array that you likely actually retrieved from somewhere else
// so you don't actuall define it here
var list = [
{ "firstname": "Tom", "lastname": "Smith" },
{ "firstname": "Bob", "lastname": "Smith" }
];
// and the query "using" the array
db.collection.find({ "names": { "$in": list } })
如果您需要使用其他表格,那么“建筑物”会变得更复杂一些:
// A list array that you likely actually retrieved from somewhere else
// so you don't actuall define it here
var list = [
{ "firstname": "Tom", "lastname": "Smith" },
{ "firstname": "Bob", "lastname": "Smith" }
];
var query = { "$or": [ ] };
// process the list to add conditions
list.forEach(function(item) {
query["$or"].push({ "names": { "$elemMatch": item } })
});
// submit the constructed "query" object to find
db.collection.find( query );